Un error Throwable es un evento de ejecución
que interrumpe el flujo normal de las instrucciones. Cuando se lanza con
throw un error Throwable, desenrolla la pila
de llamadas hasta que es capturado por un bloque catch o se alcanza el
ámbito global.
Todos los bloques finally que encuentra por el camino se ejecutarán.
Un error Throwable no capturado se pasa al
manejador de excepciones definido con
set_exception_handler(), si hay uno; de lo contrario, el
programa termina con un error fatal.
Para lanzar un error Throwable desde código
PHP, utilice la palabra clave throw.
La biblioteca estándar de PHP (SPL) proporciona varias excepciones integradas. También es posible crear excepciones personalizadas extendiendo la clase Exception.
Es posible manejar un error Throwable en PHP
rodeando el código que puede lanzar un error con un bloque try.
Los objetos Throwable no pueden clonarse.
Intentar clonar un objeto de
este tipo lanza una Error con el siguiente
mensaje:
Trying to clone an uncloneable object of class ClassName.
Esto ocurre incluso si una subclase declara su propio método
__clone().
Véanse Exception::__clone() y
Error::__clone().
Es posible añadir un manejador para cualquier
Throwable no capturado con
set_exception_handler().
Esto es similar a envolver todo el código en un bloque try-catch,
salvo que la ejecución no se reanuda después: el script termina una vez
que el manejador retorna.
Una excepción definida por el usuario puede crearse extendiendo la clase integrada Exception.
Si una clase extiende la clase integrada Exception
y redefine el constructor, se
recomienda encarecidamente que también llame a
parent::__construct() para asegurarse de que todos los datos
disponibles se han asignado correctamente.
El método __toString() puede
sobrescribirse para proporcionar una salida personalizada cuando el objeto
se utiliza como un string.
Ejemplo #1 Extender Exception
<?php
class CustomException extends Exception
{
// Redefinir el constructor para que el mensaje no sea opcional
public function __construct($message, $code = 0, ?Throwable $previous = null) {
// algo de código
// Asegurarse de que todo se asigna correctamente
parent::__construct($message, $code, $previous);
}
// Representación personalizada del objeto como string
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
try {
throw new CustomException("Algo ha ocurrido", 5);
} catch (CustomException $e) {
echo "Excepción personalizada capturada\n", $e;
$e->customFunction();
}El ejemplo anterior mostrará:
Excepción personalizada capturada CustomException: [5]: Algo ha ocurrido Una función personalizada para este tipo de excepción
La clase Exception tiene muchas subclases, entre ellas las excepciones de SPL y las definidas por las extensiones.