Comprobación de PHP lanzada tipo de excepción

3 minutos de lectura

avatar de usuario
jeffrey cordero

Por supuesto, en PHP puede capturar todas las excepciones lanzadas con:

try{
    /* code with exceptions */
}catch(Exception $e) {
    /* Handling exceptions */
}

Pero, ¿hay alguna forma de verificar el tipo de excepción de la excepción lanzada desde dentro del bloque catch?

avatar de usuario
No entrar en pánico

Puedes usar get_class:

try {
    throw new InvalidArgumentException("Non Sequitur!", 1);
} catch (Exception $e) {
    echo get_class($e);
}

  • Exactamente lo que quería, votaré cuando pueda de nuevo 🙂

    –Jeffrey Cordero

    11 de julio de 2016 a las 22:02

avatar de usuario
tom wright

Puedes tener múltiples catch bloques para capturar diferentes tipos de excepciones. Vea abajo:

try {
    /* code with exceptions */
} catch (MyFirstCustomException $e) {
    // We know it is a MyFirstCustomException
} catch (MySecondCustomException $e) {
    // We know it is a MySecondCustomException
} catch (Exception $e) {
    // If it is neither of the above, we can catch all remaining exceptions.
}

Debe saber que una vez que una Excepción es capturada por un catch declaración, ninguna de las siguientes catch se activarán las declaraciones, incluso si coinciden con la excepción.

También puede utilizar el get_class método para obtener el nombre de clase completo de cualquier objeto, incluidas las excepciones.

  • Esta en mi opinión es la respuesta correcta. probar el tipo de clase significa que probablemente sepa qué tipo de clase está buscando y, por lo tanto, puede crear las instrucciones de captura adecuadas.

    – Desarrollador Chris

    23 de enero de 2020 a las 3:14

avatar de usuario
Aaaa

creo que usando en vez de es una mejor solución, ya que le brinda más información que solo el nombre de la clase que obtiene de get_class.

class db_exception extends Exception {}
class db_handled_exception extends db_exception {}
class db_message_exception extends db_exception {}

function exception_type($ex){
    echo '<pre>';
    echo 'Type: [' . get_class($ex) . "]\n";
    echo "Instance of db_message_exception? " . var_export($ex instanceof db_message_exception,true) . "\n";
    echo "Instance of db_handled_exception? " . var_export($ex instanceof db_handled_exception,true) . "\n";
    echo "Instance of db_exception?         " . var_export($ex instanceof db_exception,true) . "\n";
    echo "Instance of Exception?            " . var_export($ex instanceof Exception,true) . "\n";
    echo '</pre>';
}

exception_type(new db_handled_exception());
exception_type(new db_message_exception());
exception_type(new db_exception());
exception_type(new exception());

Lo cual resultará de la siguiente manera

Type: [db_handled_exception]
Instance of db_message_exception? false
Instance of db_handled_exception? true
Instance of db_exception?         true
Instance of Exception?            true

Type: [db_message_exception]
Instance of db_message_exception? true
Instance of db_handled_exception? false
Instance of db_exception?         true
Instance of Exception?            true

Type: [db_exception]
Instance of db_message_exception? false
Instance of db_handled_exception? false
Instance of db_exception?         true
Instance of Exception?            true

Type: [Exception]
Instance of db_message_exception? false
Instance of db_handled_exception? false
Instance of db_exception?         false
Instance of Exception?            true

Puede haber casos en los que desee categorizar excepciones y realizar acciones comunes.

Teniendo en cuenta el ejemplo anterior, es posible que desee mostrar solo las excepciones que son del tipo db_message_exception y db_handled_exception; en este caso, dado que ambos se heredan de db_exception, simplemente puede decir algo como:

if ($ex instanceof db_exception){
   // show error message
}

También es posible que desee envolver sus excepciones para evitar derramar demasiada información en la pantalla del cliente:

if (!($ex instanceof db_exception)){
    throw new db_handled_exception('an unhandled exception occured', -1, $ex)   
}

¿Ha sido útil esta solución?