Excepciones

Nette Database usa una jerarquía de excepciones. La clase base es Nette\Database\DriverException, que extiende PDOException y ofrece funcionalidad ampliada para trabajar con los errores de la base de datos:

  • El método getDriverCode() devuelve el código de error del driver de la base de datos.
  • El método getSqlState() devuelve el código SQLSTATE.
  • Los métodos getQueryString() y getParameters() permiten obtener la consulta original y sus parámetros.

La clase DriverException la extienden las siguientes excepciones especializadas:

  • ConnectionException: indica un fallo al conectar con el servidor de la base de datos.
    • ConnectionLostException .{data-version:3.2.9}: la conexión se cayó durante una operación (reinicio del servidor, fallo de red, idle timeout); antes de seguir usándola hay que reconectar.
  • ConstraintViolationException: la clase base para las violaciones de restricciones de la base de datos, de la que heredan las siguientes excepciones:
    • ForeignKeyConstraintViolationException: violación de una restricción de clave foránea.
    • NotNullConstraintViolationException: violación de una restricción NOT NULL.
    • UniqueConstraintViolationException: violación de una restricción de unicidad.
    • CheckConstraintViolationException .{data-version:3.2.9}: violación de una restricción CHECK.
  • DeadlockException .{data-version:3.2.9}: un deadlock o un conflicto de serialización detectado por el servidor; la transacción se ha revertido y se puede reintentar.
  • LockTimeoutException .{data-version:3.2.9}: se ha superado el tiempo de espera de un bloqueo; la sentencia se ha abortado, pero la transacción que la envuelve suele seguir abierta.

El siguiente ejemplo muestra cómo capturar una UniqueConstraintViolationException, que se produce al intentar insertar un usuario con un correo que ya existe en la base de datos (suponiendo que la columna email tenga un índice único):

try {
	$database->query('INSERT INTO users', [
		'email' => 'john@example.com',
		'name' => 'John Doe',
		'password' => $hashedPassword,
	]);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
	echo 'A user with this email already exists.';

} catch (Nette\Database\DriverException $e) {
	echo 'An error occurred during registration: ' . $e->getMessage();
}