Atualizar:
A partir do PHP 7.1, isso está disponível.
A sintaxe é:
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
Confirme: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Para PHP anterior à 7.1:
Apesar do que essas outras respostas dizem, você pode capturar AError
e BError
no mesmo bloco (é um pouco mais fácil se você é quem define as exceções). Mesmo considerando que há exceções que você deseja "adotar", você ainda deve poder definir uma hierarquia para atender às suas necessidades.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Então:
catch(LetterError $e){
//voodoo
}
Como você pode ver aqui e aqui , até as SPL
exceções padrão têm uma hierarquia que você pode aproveitar. Além disso, conforme declarado no Manual do PHP :
Quando uma exceção é lançada, o código após a instrução não será executado, e o PHP tentará encontrar o primeiro bloco catch correspondente.
Isso significa que você também pode ter
class CError extends LetterError {}
que você precisa manipular de maneira diferente de AError
ou BError
, portanto, sua declaração de captura ficaria assim:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Se você teve o caso em que havia vinte ou mais exceções que pertenciam legitimamente à mesma superclasse e precisou lidar com cinco (ou qualquer grupo grande) deles de uma maneira e o restante da outra, você ainda pode fazer isso.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
E depois:
catch (Group1 $e) {}
Usar OOP quando se trata de exceções é muito poderoso. Usar coisas como get_class
ou instanceof
são hacks e deve ser evitado, se possível.
Outra solução que eu gostaria de adicionar é colocar a funcionalidade de tratamento de exceções em seu próprio método.
Você pode ter
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
Supondo que não haja absolutamente nenhuma maneira de controlar hierarquias ou interfaces de classes de exceção (e quase sempre haverá uma maneira), você pode fazer o seguinte:
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);
}
Dessa forma, você ainda terá um único local de código que precisará modificar se o mecanismo de tratamento de exceções precisar mudar e estiver trabalhando nas construções gerais do OOP.