İstisnalar
**********
Nette Database bir istisna hiyerarşisi kullanır. Temel sınıf `Nette\Database\DriverException` olup `PDOException` sınıfını genişletir ve veritabanı hatalarıyla çalışmak için gelişmiş işlevler sunar:
- `getDriverCode()` metodu, veritabanı sürücüsünden gelen hata kodunu döndürür.
- `getSqlState()` metodu, SQLSTATE kodunu döndürür.
- `getQueryString()` ve `getParameters()` metotları, özgün sorguyu ve parametrelerini almayı sağlar.
`DriverException` sınıfı şu özelleşmiş istisnalarla genişletilir:
- `ConnectionException` - veritabanı sunucusuna bağlanılamadığını gösterir.
- `ConnectionLostException` .{data-version:3.2.9} - bağlantı bir işlem sırasında koptu (sunucu yeniden başlatma, ağ arızası, idle timeout); yeniden kullanmadan önce yeniden bağlanmak gerekir.
- `ConstraintViolationException` - veritabanı kısıt ihlallerinin temel sınıfı; şu istisnalar ondan türer:
- `ForeignKeyConstraintViolationException` - yabancı anahtar kısıtının ihlali.
- `NotNullConstraintViolationException` - NOT NULL kısıtının ihlali.
- `UniqueConstraintViolationException` - benzersizlik kısıtının ihlali.
- `CheckConstraintViolationException` .{data-version:3.2.9} - CHECK kısıtının ihlali.
- `DeadlockException` .{data-version:3.2.9} - sunucunun saptadığı bir deadlock ya da serileştirme çakışması; transaction geri alındı ve yeniden denenebilir.
- `LockTimeoutException` .{data-version:3.2.9} - kilit bekleme süresi aşıldı; deyim iptal edildi, ama onu çevreleyen transaction genellikle açık kalır.
Aşağıdaki örnek, veritabanında zaten var olan bir e-postayla kullanıcı eklemeye çalışıldığında oluşan `UniqueConstraintViolationException` istisnasının nasıl yakalanacağını gösterir (`email` sütununda benzersiz bir indeks olduğu varsayılır):
```php
try {
$database->query('INSERT INTO users', [
'email' => 'john@example.com',
'name' => 'John Doe',
'password' => $hashedPassword,
]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
echo 'Bu e-postayla bir kullanıcı zaten var.';
} catch (Nette\Database\DriverException $e) {
echo 'Kayıt sırasında bir hata oluştu: ' . $e->getMessage();
}
```
İstisnalar
Nette Database bir istisna hiyerarşisi kullanır. Temel sınıf Nette\Database\DriverException olup
PDOException sınıfını genişletir ve veritabanı hatalarıyla çalışmak için gelişmiş işlevler sunar:
getDriverCode() metodu, veritabanı sürücüsünden gelen hata kodunu döndürür.
getSqlState() metodu, SQLSTATE kodunu döndürür.
getQueryString() ve getParameters() metotları, özgün sorguyu ve parametrelerini almayı
sağlar.
DriverException sınıfı şu özelleşmiş istisnalarla genişletilir:
ConnectionException – veritabanı sunucusuna bağlanılamadığını gösterir.
ConnectionLostException .{data-version:3.2.9} – bağlantı bir işlem sırasında koptu (sunucu yeniden
başlatma, ağ arızası, idle timeout); yeniden kullanmadan önce yeniden bağlanmak gerekir.
ConstraintViolationException – veritabanı kısıt ihlallerinin temel sınıfı; şu istisnalar ondan türer:
ForeignKeyConstraintViolationException – yabancı anahtar kısıtının ihlali.
NotNullConstraintViolationException – NOT NULL kısıtının ihlali.
UniqueConstraintViolationException – benzersizlik kısıtının ihlali.
CheckConstraintViolationException .{data-version:3.2.9} – CHECK kısıtının ihlali.
DeadlockException .{data-version:3.2.9} – sunucunun saptadığı bir deadlock ya da serileştirme
çakışması; transaction geri alındı ve yeniden denenebilir.
LockTimeoutException .{data-version:3.2.9} – kilit bekleme süresi aşıldı; deyim iptal edildi, ama onu
çevreleyen transaction genellikle açık kalır.
Aşağıdaki örnek, veritabanında zaten var olan bir e-postayla kullanıcı eklemeye çalışıldığında oluşan
UniqueConstraintViolationException istisnasının nasıl yakalanacağını gösterir (email sütununda
benzersiz bir indeks olduğu varsayılır):
try {
$database->query('INSERT INTO users', [
'email' => 'john@example.com',
'name' => 'John Doe',
'password' => $hashedPassword,
]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
echo 'Bu e-postayla bir kullanıcı zaten var.';
} catch (Nette\Database\DriverException $e) {
echo 'Kayıt sırasında bir hata oluştu: ' . $e->getMessage();
}