Actualizar:
A partir de PHP 7.1, esto está disponible.
La sintaxis es:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
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
y BError
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.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Luego:
catch(LetterError $e){
//voodoo
}
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 :
Cuando se produce una excepción, el código que sigue a la instrucción no se ejecutará y PHP intentará encontrar el primer bloque catch coincidente.
Esto significa que también podrías tener
class CError extends LetterError {}
que debe manejar de manera diferente que AError
o BError
, por lo que su declaración catch se vería así:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
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.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Y entonces:
catch (Group1 $e) {}
Usar OOP cuando se trata de excepciones es muy poderoso. Usar cosas como get_class
o instanceof
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
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
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:
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
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.