ExcepcionesAmpliar las Excepciones
Una clase de Excepción definida por el usuario puede ser definida ampliando la clase
Exception interna. Los miembros y las propiedades de abajo muestran lo que es accesible
dentro de la clase hija que deriva de la clase Exception interna.
La clase Exception Interna
]]>
Si una clase extiende la clase Exception interna y redefine el constructor, se recomienda encarecidamente
que también llame a parent::__construct()
para asegurarse que toda la información disponible haya sido asignada apropiadamente. El
método __toString() puede ser sobrescrito
para proporcionar una salida personalizada cuando el objeto es presentado como un string.
Las excepciones no se pueden clonar. Intentar clonar una Excepción resultará en un
error E_ERROR fatal.
Extender la clase Exception (PHP 5.3.0+)
code}]: {$this->message}\n";
}
public function funciónPersonalizada() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
/**
* Crear una clase para probar la excepción
*/
class ProbarExcepción
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// lanzar la excepción personalizada
throw new MiExcepción('1 no es un parámetro válido', 5);
break;
case self::THROW_DEFAULT:
// lanzar la predeterminada.
throw new Exception('2 no está permitido como parámetro', 6);
break;
default:
// No hay excepción, el objeto se creará.
$this->var = $avalue;
break;
}
}
}
// Ejemplo 1
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (MiExcepción $e) { // Será atrapada
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Skipped
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 2
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_DEFAULT);
} catch (MiExcepción $e) { // Este tipo no coincide
echo "Atrapada mi excepción\n", $e;
$e->funciónPersonalizada();
} catch (Exception $e) { // Will be caught
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 3
try {
$o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM);
} catch (Exception $e) { // Será atrapada
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // Null
echo "\n\n";
// Ejemplo 4
try {
$o = new ProbarExcepción();
} catch (Exception $e) { // Saltado, sin excepción
echo "Atrapada la Excepción Predeterminada\n", $e;
}
// Continuar la ejecución
var_dump($o); // ProbarExcepción
echo "\n\n";
?>
]]>
Las versiones de PHP 5, anteriores a PHP 5.3.0, no soportan excepciones anidadas.
El siguiente fragmento de código se puede usar para reemplazar la clase MiExcepción
si se desea ejecutar este ejemplo.
code}]: {$this->message}\n";
}
public function funciónPersonalizada() {
echo "Una función personalizada para este tipo de excepción\n";
}
}
?>
]]>
PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de programación.
Una excepción puede ser lanzada ("&throw;n"), y atrapada ("&catch;ed") dentro de
PHP. El código puede estar dentro de un bloque &try; para facilitar la captura
de excepciones potenciales. Cada bloque &try; debe tener al menos un
bloque &catch; o &finally; correspondiente.
El objeto lanzado debe ser una instancia de la
clase Exception o una subclase de
Exception. Intentar lanzar un objeto que no lo sea
resultará en un Error Fatal de PHP.
catch
Se pueden usar múltiples bloques &catch; para atrapar diferentes clases de
excepciones. La ejecución normal (cuando no es lanzada ninguna excepción dentro del bloque
&try;) continuará después del último bloque &catch; definido en la sencuencia.
Las excepciones pueden ser lanzadas ("&throw;n") (o relanzadas) dentro de un bloque &catch;.
Cuando una excepción es lanzada, el código siguiente a la declaración no será
ejecutado, y PHP intentará encontrar el primer bloque &catch; coincidente.
Si una excepción no es capturada, se emitirá un Error Fatal de PHP con un
mensaje "Uncaught Exception ..." ("Excepción No Capturada"), a menos que se haya
definido un manejador con set_exception_handler.
finally
En PHP 5.5 y posterior, se puede utilizar un bloque &finally; después o
en lugar de los bloques &catch;. El código de dentro del bloque &finally; siempre se
ejecutará después de los bloques &try; y &catch;, independientemente de que se haya
lanzado una excepción o no, y antes de que la ejecución normal continúe.
&reftitle.notes;
Las funciones internas de PHP utilizan principalmente la
Información de Errores, sólo las extensiones
Orientadas a objetos
modernas utilizan excepciones. Sin embargo, los errores se pueden traducir a
excepciones simplemente con ErrorException.
La Biblioteca Estádar de PHP (SPL) proporciona
un buen número de excepciones
internas.
&reftitle.examples;
Lanzar una Excepción
getMessage(), "\n";
}
// Continuar la ejecución
echo 'Hola Mundo\n';
?>
]]>
&example.outputs;
Manejo de excepciones con un bloque finally
getMessage(), "\n";
} finally {
echo "Primer finally.\n";
}
try {
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
} finally {
echo "Segundo finally.\n";
}
// Continuar ejecución
echo 'Hola Mundo\n';
?>
]]>
&example.outputs;
Excepciones anidadas
getMessage());
}
}
}
$foo = new Prueba;
$foo->probar();
?>
]]>
&example.outputs;