Eccezioni
Nette Database usa una gerarchia di eccezioni. La classe di base è Nette\Database\DriverException, che estende
PDOException e offre funzionalità avanzate per lavorare con gli errori del database:
- Il metodo
getDriverCode()restituisce il codice di errore del driver del database. - Il metodo
getSqlState()restituisce il codice SQLSTATE. - I metodi
getQueryString()egetParameters()permettono di ottenere la query originale e i suoi parametri.
Dalla classe DriverException derivano queste eccezioni specializzate:
ConnectionException– segnala il fallimento della connessione al server del database.ConnectionLostException.{data-version:3.2.9} – la connessione è caduta durante un'operazione (riavvio del server, guasto di rete, idle timeout); prima di continuare a usarla serve una riconnessione.
ConstraintViolationException– classe base per le violazioni dei vincoli del database, dalla quale ereditano queste eccezioni:ForeignKeyConstraintViolationException– violazione di un vincolo di chiave esterna.NotNullConstraintViolationException– violazione di un vincolo NOT NULL.UniqueConstraintViolationException– violazione di un vincolo di unicità.CheckConstraintViolationException.{data-version:3.2.9} – violazione di un vincolo CHECK.
DeadlockException.{data-version:3.2.9} – deadlock o conflitto di serializzazione rilevato dal server; la transazione è stata annullata e si può ritentare.LockTimeoutException.{data-version:3.2.9} – è stato superato il tempo di attesa di un lock; il comando è stato interrotto, ma la transazione circostante di solito resta aperta.
L'esempio seguente mostra come catturare l'eccezione UniqueConstraintViolationException, che si verifica quando si
cerca di inserire un utente con una email già presente nel database (supponendo che la colonna email abbia un indice
univoco):
try {
$database->query('INSERT INTO users', [
'email' => 'john@example.com',
'name' => 'John Doe',
'password' => $hashedPassword,
]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
echo 'Un utente con questa email esiste già.';
} catch (Nette\Database\DriverException $e) {
echo 'Durante la registrazione si è verificato un errore: ' . $e->getMessage();
}