Me gustaría una forma más limpia de obtener la siguiente funcionalidad, para capturar AError
y BError
en un bloque:
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
¿Hay alguna forma de hacer esto? ¿O tengo que atraparlos por separado?
AError
y Berror
tienen una clase base compartida, pero también la comparten con otros tipos a los que me gustaría acceder handler2
, por lo que no puedo atrapar la clase base.
php
exception-handling
Dominic Gurto
fuente
fuente
Respuestas:
Actualizar:
A partir de PHP 7.1, esto está disponible.
La sintaxis es:
Documentos: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Comprometerse: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Para PHP anterior a 7.1:
A pesar de lo que dicen estas otras respuestas, puede atrapar
AError
yBError
en el mismo bloque (es algo más fácil si usted es quien define las excepciones). Incluso teniendo en cuenta que hay excepciones que desea "incumplir", debe poder definir una jerarquía que satisfaga sus necesidades.Luego:
Como puede ver aquí y aquí , incluso las
SPL
excepciones predeterminadas tienen una jerarquía que puede aprovechar. Además, como se indica en el Manual de PHP :Esto significa que también podrías tener
que debe manejar de manera diferente que
AError
oBError
, por lo que su declaración catch se vería así:Si tuvo el caso en el que hubo veinte o más excepciones que pertenecían legítimamente a la misma superclase, y tuvo que manejar cinco (o cualquier grupo grande) de una manera y el resto de la otra, TODAVÍA puede hacer esto.
Y entonces:
Usar OOP cuando se trata de excepciones es muy poderoso. Usar cosas como
get_class
oinstanceof
son hacks, y debe evitarse si es posible.Otra solución que me gustaría agregar es poner la funcionalidad de manejo de excepciones en su propio método.
Podrías tener
Asumiendo que no hay absolutamente ninguna manera de controlar las jerarquías o interfaces de clases de excepción (y casi siempre habrá una forma), puede hacer lo siguiente:
De esta manera, todavía tiene una única ubicación de código único que debe modificar si su mecanismo de manejo de excepciones necesita cambiar, y está trabajando dentro de las construcciones generales de OOP.
fuente
AError
podría implementarse en una biblioteca / archivo actualizado por un tercero.En PHP> = 7.1 esto es posible. Vea la respuesta a continuación.
Si puede modificar las excepciones, use esta respuesta .
Si no puede, puede intentar atraparlos todos
Exception
y luego verificar con qué excepción se produjoinstanceof
.Pero probablemente sería mejor usar múltiples bloques catch como se describe en la respuesta mencionada anteriormente .
fuente
finally
declaración. ;)... } else { throw($e); }
si no coincide con los dos. Perdón por la sintaxis quizás incorrecta, no vi php por un tiempo.En PHP 7.1 está la capacidad de atrapar múltiples tipos.
Para que esto:
y
son funcionalmente equivalentes
fuente
A partir de PHP 7.1,
Curiosamente, también puedes:
y en versiones anteriores de PHP:
fuente
Este artículo cubre la pregunta electrictoolbox.com/php-catch-multiple-exception-types . Contenido de la publicación copiada directamente del artículo:
Excepciones de ejemplo
Aquí hay algunas excepciones de ejemplo que se han definido para los propósitos de este ejemplo:
Manejo de múltiples excepciones
Es muy simple: puede haber un bloque catch para cada tipo de excepción que se puede generar:
Si se lanza una excepción que no es manejada por ninguna de las otras declaraciones catch, será manejada por el bloque catch (Excepción $ e). No necesariamente tiene que ser el último.
fuente
catch (Throwable $e)
capturar todas las excepciones. Ver también: php.net/manual/en/class.throwable.phpComo una extensión de la respuesta aceptada, puede cambiar el tipo de Excepción que resulta en un patrón que es algo así como el ejemplo original:
fuente
Aquí hay una alternativa razonable si no tiene control sobre la definición de las excepciones. Use el nombre de la variable de excepción para clasificar las excepciones cuando se detectan. Luego verifique la variable de excepción después del bloque try / catch.
Este enfoque de aspecto un tanto extraño probablemente solo valga la pena si hay mucha duplicación entre las implementaciones de bloque de captura.
fuente
Además de la caída, también es posible dar un paso adelante usando goto . Es muy útil si quieres ver arder el mundo.
3v4l.org
fuente
Una excelente manera es usarlo
set_exception_handler
.¡¡¡Advertencia!!! con PHP 7, puede obtener una pantalla blanca de la muerte por errores fatales. Por ejemplo, si llama a un método en un no objeto, normalmente lo obtendrá
Fatal error: Call to a member function your_method() on null
y esperaría ver esto si el informe de errores está activado.El error anterior NO será atrapado con
catch(Exception $e)
. El error anterior NO activará ningún controlador de errores personalizado establecido porset_error_handler
.Debe usar
catch(Error $e){ }
para detectar errores en PHP7. . Esto podría ayudar:fuente
catch (Throwable $e) { ... }
y terminar con eso. Ver también: php.net/manual/en/class.throwable.phpOtra opción que no se enumera aquí es usar el
code
atributo de una excepción, para que pueda hacer algo como esto:fuente
extends \Exception
?Hmm, hay muchas soluciones escritas para la versión php inferior a 7.1.
Aquí hay otro simple para aquellos que no quieren atrapar todas las excepciones y no pueden hacer interfaces comunes:
fuente