Pergunta

Eu estou mudando de mysql simples em php para DOP e tenho notado que a maneira comum de teste para erros está usando uma combinação try / catch em vez de if / else combinações.

Qual a vantagem desse método, eu posso usar um bloco try / catch em vez de vários aninhados if / blocos de outra pessoa para lidar com todos os erros para os diferentes passos (Connect, preparar, executar, etc.)?

Foi útil?

Solução

Eu usaria o bloco try / catch quando o caminho normal através do código deve continuar sem erro a menos que haja realmente algumas condições excepcionais - como o servidor a ser baixo, suas credenciais de ser expirado ou incorreta. Eu não necessariamente usá-lo para lidar com erros não-excepcionais - dizer como o usuário atual não estar no papel correto. Ou seja, quando você pode razoavelmente esperar e lidar com um erro que não é uma condição excepcional, eu acho que você deve fazer seus cheques.

No caso que você descreveu - configurar e executar uma consulta, um bloco try / catch é uma excelente maneira de lidar com isso como você normalmente esperaria a consulta para ter sucesso. Por outro lado, você provavelmente vai querer verificar que o conteúdo do resultado são o que você espera com a lógica de fluxo de controle em vez de apenas tentar usar dados que podem não ser válido para a sua finalidade.

Uma coisa que você quer olhar para fora é o uso malfeita de try / catch. Try / catch não deve ser usado para se proteger de má programação - o "eu não sei o que vai acontecer se eu fizer isso, então eu vou envolvê-la em um try / catch e esperar o melhor" tipo de programação. Normalmente você vai querer restringir os tipos de exceções que você pegar para aqueles que não estão relacionados com o próprio código (servidor para baixo, as credenciais ruins, etc.) para que você possa encontrar e corrigir erros que são código relacionados (ponteiros nulos, etc .).

Outras dicas

Em geral, os blocos try-catch são grandes, porque eles vão quebrar (movimento para a instrução catch) sempre que ocorre a exceção. If-else blocos confiar em você prever quando o erro vai acontecer.

Edit: Além disso, os blocos catch não vai parar o seu código de parada quando um erro é atingido.

A vantagem de try / catch e exceções, em geral, é mais para as pessoas em desenvolvimento bibliotecas como DOP. Eles permitem que um desenvolvedor do sistema para lidar com situações indefinidas ou resultados inesperados de uma forma rápida e fácil. Dê uma conexão com o banco. O deve um sistema de fazer se o banco de dados não pode ser alcançado. Deve parar a execução? Tente novamente? Jogue um aviso e continuar? O desenvolvedor do sistema não pode saber o que você vai precisar dele para fazer, eles jogam uma exceção, que você vai depois pegar e tratar.

A vantagem para você, como um consumidor do sistema é, em vez de obter algum volta código de erro vaga, ou um falso booleano simples que falhou, você recebe um objeto de exceção que irá

  1. Ser chamado de tal forma que é mais óbvio o que deu errado (Se bem me lembro, DOP tem apenas um tipo de exceção, mas outros sistemas contêm vários tipos de exceção para diferentes tipos de erros)

  2. Maio / deve conter métodos e propriedades que podem ajudá-lo a descobrir o por a exceção foi lançada

Essa é a de qualquer maneira teoria. Há muitas pessoas inteligentes que afirmam As exceções são o caminho a percorrer. Há também grande quantidade de pessoas inteligentes que pensam exceções são o diabo, e uma muleta para desenvolvedores de sistema preguiçosos. Não há nada que se assemelha a um consenso sobre esta questão.

try / catch separa totalmente o erro de manipulação lógica da lógica objeto de negócios.

jogar e pegar uma exceção é uma operação cara em comparação com a maioria qualquer outra operação primitiva. Se este é um pedaço de código que precisa para um bom desempenho (por exemplo, dentro de um loop), você vai querer olhar para o seu caso de uso - se você espera que as exceções para ser jogado com relativa frequência, você vai ser melhor fora com um caso / else perforance-wise (a menos que o código subjacente é apenas envolvendo uma exceção para você, caso em que não há nenhum ganho em tudo). Se as exceções só são jogados em raras circunstâncias, então você é melhor fora com um try / catch para evitar a sobrecarga de ramificação dentro de um loop.

@Perchik:

A minha filosofia geral de manipulação de erro:

Você deve uso if / else para lidar com todos os casos que você espera. Você deve não uso try {} catch {} para alça tudo (na maioria dos casos) porque uma exceção útil poderia ser levantada e você pode aprender sobre a presença de um erro de isto. Você deve uso try {} catch {} em situações onde você suspeitar de algo pode / vai dar errado e você não quer que ele para derrubar todo o sistema, como problemas de acesso ao sistema de tempo limite de rede / arquivos, se os arquivos não existem, etc.

Vexing exceções

Isso é exatamente a vantagem, usando um try / catch em vez de múltipla se declarações. Você também será capaz de detectar quaisquer erros inesperados.

Desde DOP está usando objetos, eles estão levantando Exceções, se ocorrer um erro. O velho mysql / mysqli eram meras funções e não lançar exceções eles simplesmente devolvidos códigos de erro. Try / catch é usado quando uma exceção pode ser jogado a partir do código, e você pegá-lo no catch-cláusula, que é uma maneira orientada a objeto a erros punho. Você não pode capturar exceções com if / else blocos -. Eles compartilham nada com try / catch

Todo mundo tinha boas respostas - mas eu percebi que eu iria jogar meu próprio em:

  1. try / catch é uma exceção real mecanismo de tratamento -. Por isso, se você mudar suas exceções, ele será automaticamente trabalho em todas as instruções try / catch
  2. try / catch dá a oportunidade de executar o código, mesmo no caso de uma grande exceção que pode matar a volta if / else e, além disso, a instrução try pode ser rolada (se você estiver mais experiente).

No PHP usando try catch com inheritence, nós podemos jogar exceção de outra classe.

Exemplo: -. Estou no controller e validar os dados do usuário usando Models

Se os gatilhos de erro, eu só tenho que jogar exceção de métodos Model.

A execução na tentativa vai quebrar e catched na Catch Block.

Portanto, há menos sobrecarga de retornar vales bool e verificar isso.

Além deste Try Catch funciona muito bem Quando usar em cadeia (Try - Catch dentro de outro Try - Catch).

Completamente concordar com @Jared Updike

Normalmente, o tratamento de exceções é feito com o usuário saber pouco ou nada sobre isso. Por outro lado, o usuário do sistema sabe sobre o que acontece dentro de um bloco if-else.

por exemplo. Ele deve ser uma cláusula "else", que mostra um usuário ATM, a mensagem "saldo bancário insuficiente" quando o seu saldo estiver baixo. E esta mensagem não pode ser sentado dentro de um bloco "catch" por qualquer razão !!

Vamos dizer que está escrevendo um código de divisão a / b e o caso mais famoso exceção ocorreu ou seja, erro 0 divisão, o que você acha que pode ser feito em seguida? 1. Você pode imprimir uma mensagem e sair. 2. Você pode imprimir uma mensagem e permitir que o usuário re-introduzir os valores, etc.

Há casos em que diferentes pessoas / vendedores querem lidar com o mesmo caso de exceção de maneira diferente. A captura bloco de deixá-los fazer isso com facilidade. Se você precisa mudar a maneira como um determinado caso de exceção será tratada, você só precisa mudar o bloco catch.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top