İ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()vegetParameters()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();
}