Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Dias_132983

pra que serve TRY e CATCH

Recommended Posts

sem dúvida alguém vai dar uma resposta mais completa mas aqui vai minha contribuição:

 

eles servem para lançar exceções(erros) ao usuário como um if e else faria porém o grande diferencial que ele é usado quando esta programando em grupo, nada impede de usar se você esta programando sozinho realmente pode te ajudar a lembrar das coisas.

 

o try vai tentar executar aquele comando e caso não consiga ele vai dar erro e você pode controlar esse erro com as exceptions, geralmente ele não são usados para erros em algorítimo como if else e sim para erros de sistema mesmo para que o programador possa saber origem do erro mais facilmente e corrigi-lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esses blocos surgiram da necessidade de haver um tratamento mais refinado de erros no paradigma orientado a objetos.

Antes do surgimento das exceções, ao ocorrer um erro, todo o programa falhava. No PHP existe a função trigger_error que faz exatamente isso: lança um erro que, dependendo da severidade, mata o script no mesmo instante.

 

Entretanto, boa parte dos erros pode ser previsto e tratado. Nesses casos, não vale a pena matar toda a execução por causa de tais erros. Surgiu então o conceito de 'exceção', que como o próprio nome diz, é uma exceção, um comportamento atípico, diferente do normal esperado para o programa, um erro. Se você sabe como tratar tal exceção, você pode seguir com a execução sem problemas.

 

O bloco try ... catch tem exatamente essa função de "pegar" possíveis exceções lançadas. Se qualquer statement (ou linha de código, simplificadamente falando) dentro de um bloco try lançar uma exceção, o programa se desviará para o bloco catch e nenhuma linha de código DENTRO DO BLOCO TRY subsequente à que lançou a exceção será executada.

 

Exemplo:

 

try {
$obj1->metodo1();
$obj2->metodo2(); // lança exceção
// Daqui pra baixo, nada será executado
$obj1->outroMetod();
// ...
} catch(Exception $e) {
// Se for lançada uma exceção no bloco acima, o programa se desviará para este bloco
echo 'Um erro ocorreu';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Continuando a explicação muito boa, diga-se de passagem, do @Henrique Barcelos. Eu sempre vi muitas dificuldades entre os desenvolvedores para saberem o que é uma exceção.

 

Uma breve explicação é: 'Uma exceção é tudo aquilo que sai do "caminho feliz"'.

 

O "caminho feliz" nada mais é que o rumo desejado de um sistema. Quando o usuário faz a sequência exata de comandos e o sistema responde da forma esperada, sem a surpresa de um bug.

 

Nunca podemos espera que o usuário faça a "sequência perfeita" e nem que o sistema sempre se comporte da mesma maneira, principalmente com dependências externas (WebService, SGBD, Luas de Saturno...).

 

Mas, como já foi mencionado, podemos prever certas situações rotineiras.

 

Um bom exemplo, e simples, para pensar em exceções, é um login. Considerando que o "caminho feliz" é:

- usuário preencher os campos;

- solicitar a autenticação;

- logar no sistema.

 

Tudo que sair dessa lista, que não ocorrer por algum motivo, é uma exceção. No exemplo acima, exceções poderiam ser:

- Usuário inválido (ou não preenchido);

- Senha inválida (ou não preenchida);

- Falta de conexão com o SGBD;

- Falta de permissões.

 

Existem N motivos que ocorra uma exceção, esses são os mais comuns. No PHP, muitas exceções são tratadas pelo Javascript, que é o caso de usuário/senha não preenchido. Mas desative o javascript, e você terá a tentativa de conexão do sistema sem usuário e sem senha.

 

Algumas literaturas defendem que, o que for validação e que possa sair do "caminho feliz", deve ser utilizado exceções ao invés do tradicional if/else. Mas sempre, e como sempre, há controvérsias. Em Java, por exemplo, essa situação é bem melhor defendida do que para o PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Complementando um pouco mais...

No PHP não era muito comum o uso de exceptions até bem pouco tempo atrás, mas é praticamente impossível escrever códigos em Java ou em Python sem blocos try ... catch...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato. Essa é uma barreira que, eu gostaria muito, deveria ser quebrada.

 

O PHP está crescendo, e segundo eu vejo na RFC do PHP, está tomando o rumo certo. Muitas coisas são apenas enfeites e a comunidade descarta, mas boas implementações estão sendo feitas.

 

A pouco tempo (menos de 2 meses) adicionaram a keyword finally que é diretamente ligada ao nosso assunto em questão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato. Essa é uma barreira que, eu gostaria muito, deveria ser quebrada.

 

O PHP está crescendo, e segundo eu vejo na RFC do PHP, está tomando o rumo certo. Muitas coisas são apenas enfeites e a comunidade descarta, mas boas implementações estão sendo feitas.

 

A pouco tempo (menos de 2 meses) adicionaram a keyword finally que é diretamente ligada ao nosso assunto em questão.

 

 

Muito boa sua colaboração Gabriel. Pude estudar sobre a implementação do Finally nos blocos Try/Catch, é realmente útil principalmente para garantir por exemplo o encerramento de uma conexão ao banco de dados.

 

 

O RFC é um canal que a comunidade PHP tem para discutir possíveis funcionalidades extras que poderiam ser adicionadas numa próxima atualização do PHP? Dai abre um discussão para ver a importância daquela sugestão em pauta e se for aprovada pela comunidade e pela Zend, ela pode ser introduzida na linguagem?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, conheço o RFC a pouco tempo, mas, pelo que eu entendi, é exatamente isso. Um usuário sugere uma implementação/alteração de função/classe/biblioteca. Ele deve fornecer motivos e cases para essa implementação. Alguns usuários até colocam o código, em C, para já facilitar o que necessita ser alterado.

 

A comunidade julga e decide se será ou não implementada.

 

Por exemplo, esta implementação foi descartada:

- ifsetor. (era pra ser semelhante ao COALESCE do SQL, mas com base no operador ternário)

 

Eu achei apenas uma "firula", substituir o operador ternário por uma simples função. Para mim é uma descaracterização de linguagem (operador ternário), uma vez que isso é desnecessário e o desenvolvedor que quiser usufruir dessa função pode criá-la em sua biblioteca de funções. Além de que, todas as funcionalidades de um operador ternário não são expostas nessa função proposta.

 

Quando eu digo "firula", quero me referir a preguiça em escrever código e/ou funções com inúmeras utilidades e retornos diversos, ao mesmo tempo.

 

Apesar de muitas funções que o PHP possui, que vieram do PHP 3 e 4, sigam a mesma linha que algumas implementações reijeitadas. Continuam e continuarão sendo utilizadas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pelo que eu entendi, o finally foi implementado, mas ainda não consta em nenhuma versão já liberada do PHP. Se quer fazer uso da mesma, precisa fazer a sua própria compilação. Ou seja, impossível de se utilizar em produção, a não ser que possua um servidor dedicado ou uma máquina na nuvem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.