Eu gostaria de uma maneira mais limpa de obter a seguinte funcionalidade, pegar AError
e BError
em um bloco:
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
Há alguma maneira de fazer isso? Ou tenho que pegá-los separadamente?
AError
e Berror
têm uma classe base compartilhada, mas eles também a compartilham com outros tipos que eu gostaria de abordar handler2
, então não posso simplesmente pegar a classe base.
php
exception-handling
Dominic Gurto
fonte
fonte
Respostas:
Atualizar:
A partir do PHP 7.1, isso está disponível.
A sintaxe é:
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
eBError
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.Então:
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 :Isso significa que você também pode ter
que você precisa manipular de maneira diferente de
AError
ouBError
, portanto, sua declaração de captura ficaria assim: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.
E depois:
Usar OOP quando se trata de exceções é muito poderoso. Usar coisas como
get_class
ouinstanceof
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
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:
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.
fonte
AError
pode ser implementado em uma biblioteca / arquivo que é atualizado por terceiros.No PHP> = 7.1, isso é possível. Veja a resposta abaixo.
Se você pode modificar as exceções, use esta resposta .
Se não puder, você pode tentar descobrir tudo
Exception
e verificar com qual exceção foi lançadainstanceof
.Mas provavelmente seria melhor usar vários bloqueios de captura, conforme descrito na resposta acima mencionada .
fonte
finally
declaração. ;)... } else { throw($e); }
se não corresponder às duas. Desculpe por talvez sintaxe errada, não vi php por um tempo.Chegando no PHP 7.1 é a capacidade de pegar vários tipos.
Para que isso:
e
são funcionalmente equivalentes.
fonte
A partir do PHP 7.1,
Curiosamente, você também pode:
e nas versões anteriores do PHP:
fonte
Este artigo aborda a questão electrictoolbox.com/php-catch-multiple-exception-types . Conteúdo da postagem copiada diretamente do artigo:
Exceções de exemplo
Aqui estão alguns exemplos de exceções que foram definidas para os fins deste exemplo:
Manipulando Várias Exceções
É muito simples - pode haver um bloco catch para cada tipo de exceção que pode ser lançado:
Se for lançada uma exceção que não seja tratada por nenhuma das outras instruções catch, ela será tratada pelo bloco catch (Exception $ e). Não precisa necessariamente ser o último.
fonte
catch (Throwable $e)
capturar todas as exceções. Veja também: php.net/manual/en/class.throwable.php #Como uma extensão da resposta aceita, você pode alternar o tipo de exceção, resultando em um padrão semelhante ao exemplo original:
fonte
Aqui está uma alternativa razoável se você não tiver controle sobre a definição das exceções. Use o nome da variável de exceção para categorizar as exceções quando elas são capturadas. Em seguida, verifique a variável de exceção após o bloco try / catch.
Essa abordagem de aparência um tanto estranha provavelmente só vale a pena se houver muita duplicação entre implementações de blocos de captura.
fonte
Além do fall-through, também é possível avançar usando goto . É muito útil se você quiser ver o mundo queimar.
3v4l.org
fonte
Uma ótima maneira é usar
set_exception_handler
.Aviso!!! com o PHP 7, você pode obter uma tela branca da morte por erros fatais. Por exemplo, se você chamar um método em um não-objeto, normalmente obteria
Fatal error: Call to a member function your_method() on null
e esperaria ver isso se o relatório de erros estiver ativado.O erro acima NÃO será detectado
catch(Exception $e)
. O erro acima NÃO acionará nenhum manipulador de erro personalizado definido porset_error_handler
.Você deve usar
catch(Error $e){ }
para capturar erros no PHP7. . Isso pode ajudar:fonte
catch (Throwable $e) { ... }
e acabar com isso. Veja também: php.net/manual/en/class.throwable.php #Outra opção não listada aqui é usar o
code
atributo de uma exceção, para que você possa fazer algo assim:fonte
extends \Exception
?Hmm, existem muitas soluções escritas para a versão php abaixo da 7.1.
Aqui está outro exemplo simples para quem não deseja capturar todas as exceções e não pode criar interfaces comuns:
fonte