Pergunta

Devo sempre envolver chamadas de recursos externos em um try-catch? (Ie. Chamadas para um sistema de banco de dados ou arquivo) Existe uma prática recomendada para o tratamento de erros ao chamar recursos externos?

Foi útil?

Solução

captura únicas exceções que pode lidar . Assim, por exemplo quando se utiliza recursos externos, a melhor prática é pegar específicas exceções que você sabe que você pode manipular. No caso de arquivos isso pode ser (IOException, SecurityException, etc), em caso de banco de dados a exceção pode ser SqlException ou outros.

Em qualquer caso, não pegar exceções que você não manipulam , deixá-los fluir para uma camada superior que pode. Ou se, por algum motivo você faz exceções captura, mas não lidar com eles, relançar-los usando apenas jogar;. (que irá criar uma rethrow IL op, ao contrário de trow)

Em caso de utilização de recursos que você não sabe que tipo de exceções pode jogar, você está tipo de forçado a pegar o tipo de exceção geral. E, neste caso, a coisa cofres seria a utilização de recursos, disse a partir de um domínio de aplicativo diferente (se possível), ou deixar a bolha exceção até nível superior (ex UI) onde podem ser exibidas ou registradas.

Outras dicas

Eu acho que existem três razões para ter um bloco catch:

  • Você pode tratar a exceção e recuperar (de "baixo nível" código)
  • Você quer embrulhe a exceção (mais uma vez, a partir do código "baixo nível")
  • Você está no topo da pilha, e enquanto você não pode recuperar a operação em si, você não deseja que o aplicativo inteiro para ir para baixo

Se se mantiver a estes, você deve ter muito poucos blocos catch comparação com blocos try/finally - e aqueles blocos try/finally são quase sempre apenas chamando Dispose, e, portanto, melhor escrito como declarações using.

A linha inferior:. É muito importante ter um bloco finally liberar recursos, mas blocos catch geralmente deve ser mais raro

Eric Lippert tem um bom blog sobre isso, aqui .

Não há nenhum ponto (com exceção de "irritante" (ver blog)) captura uma exceção a menos que você pode fazer algo útil; e na maioria dos casos, você simplesmente não pode - então deixe-bolha (sua interface do usuário deve, obviamente, limpeza e mostrar algo)

.

Você pode, no entanto, ter um "try / finally" para lidar com a gestão de recursos. Ou mesmo mais limpo, um "usando" bloco para fazer o mesmo.

Eu acho que a resposta absoluta é completamente condicional (como o controle você tem sobre o meio ambiente, o que é o equilíbrio esperado entre desempenho e consistência e muitos outros tenho certeza), mas em geral eu sempre faço, escolhendo a segurança ao longo o desempenho potencialmente mais lento.

sempre depender do que você deseja alcançar. Um servidor não respondendo pode ser suficiente séria para parar tudo o que a rotina o que fazer, e a exceção deve ser lançada para o chamador.

Em outros casos, você não se importam se você não conseguiu atualizar a db ou não. Em seguida, consumindo a exceção é OK.

Obviamente, você não quer mostrar o rastreamento de pilha para o usuário final, porém, de forma que você precisa pegá-lo em algum lugar.

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