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