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?
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
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
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)
}