Excepciones

Tabla de contenidos

PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de programación. Una excepción puede ser lanzada ("thrown"), y atrapada ("catched") 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 ("thrown") (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.

Notas

Nota:

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.

Sugerencia

La Biblioteca Estádar de PHP (SPL) proporciona un buen número de excepciones internas.

Ejemplos

Ejemplo #3 Lanzar una Excepción

<?php
function inverso($x) {
    if (!
$x) {
        throw new 
Exception('División por cero.');
    }
    return 
1/$x;
}

try {
    echo 
inverso(5) . "\n";
    echo 
inverso(0) . "\n";
} catch (
Exception $e) {
    echo 
'Excepción capturada: ',  $e->getMessage(), "\n";
}

// Continuar la ejecución
echo 'Hola Mundo\n';
?>

El resultado del ejemplo sería:

0.2
Excepción capturada: División por cero.
Hola Mundo

Ejemplo #4 Manejo de excepciones con un bloque finally

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('División por cero.');
    }
    return 
1/$x;
}

try {
    echo 
inverse(5) . "\n";
} catch (
Exception $e) {
    echo 
'Excepción capturada: ',  $e->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';
?>

El resultado del ejemplo sería:

0.2
Primer finally.
Excepción capturada: División por cero.
Segundo finally.
Hola Mundo

Ejemplo #5 Excepciones anidadas

<?php

class MiExcepción extends Exception { }

class 
Prueba {
    public function 
probar() {
        try {
            try {
                throw new 
MiExcepción('foo!');
            } catch (
MiExcepción $e) {
                
// relanzarla
                
throw $e;
            }
        } catch (
Exception $e) {
            
var_dump($e->getMessage());
        }
    }
}

$foo = new Prueba;
$foo->probar();

?>

El resultado del ejemplo sería:

string(4) "foo!"