Estou preso em decidir como lidar com exceções em meu aplicativo.
Muito se meus problemas com exceções vierem de 1) acessar dados por meio de um serviço remoto ou 2) desserializar um objeto JSON. Infelizmente, não posso garantir o sucesso para nenhuma dessas tarefas (corte de conexão de rede, objeto JSON malformado que está fora do meu controle).
Como resultado, se eu encontrar uma exceção, simplesmente a capturo dentro da função e retorno FALSE para o chamador. Minha lógica é que tudo o que o chamador realmente se preocupa é se a tarefa foi bem-sucedida, e não por que não foi bem-sucedida.
Aqui está um exemplo de código (em JAVA) de um método típico)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Acho que essa abordagem é boa, mas estou muito curioso para saber quais são as melhores práticas para gerenciar exceções (devo realmente fazer uma exceção borbulhar em toda a pilha de chamadas?).
Em resumo das principais questões:
- É correto apenas capturar as exceções, mas não colocá-las em bolhas ou notificar formalmente o sistema (por meio de um log ou uma notificação ao usuário)?
- Quais são as práticas recomendadas para exceções que não resultam em tudo que exige um bloco try / catch?
Acompanhamento / Editar
Obrigado por todos os comentários, encontramos algumas fontes excelentes sobre gerenciamento de exceções online:
- Melhores práticas para tratamento de exceções | O'Reilly Media
- Práticas recomendadas para lidar com exceções em .NET
- Melhores práticas: gerenciamento de exceções (o artigo agora aponta para a cópia archive.org)
- Antipadrões de tratamento de exceções
Parece que o gerenciamento de exceções é uma daquelas coisas que variam com base no contexto. Mas o mais importante, deve-se ser consistente em como eles gerenciam exceções dentro de um sistema.
Além disso, tome cuidado com a podridão de código por meio de try / catches excessivos ou não dando respeito a uma exceção (uma exceção é alertar o sistema, o que mais precisa ser avisado?).
Além disso, este é um comentário bem escolhido de m3rLinEz .
Tendo a concordar com Anders Hejlsberg e você, a maioria das pessoas que ligam só se importam se a operação foi bem-sucedida ou não.
A partir deste comentário, surgem algumas questões para pensar ao lidar com exceções:
- Qual é o ponto dessa exceção sendo lançada?
- Como faz sentido lidar com isso?
- O chamador realmente se preocupa com a exceção ou apenas se importa se a chamada foi bem-sucedida?
- Forçar um chamador a gerenciar uma exceção potencial é normal?
- Você está sendo respeitoso com as expressões da língua?
- Você realmente precisa retornar um sinalizador de sucesso como booleano? Retornar booleano (ou um int) é mais uma mentalidade C do que Java (em Java, você apenas trataria da exceção).
- Siga as construções de gerenciamento de erros associadas ao idioma :)!