Por que o ReSharper digamos "cláusula de captura com single 'lance' declaração é redundante?
-
06-07-2019 - |
Pergunta
Eu pensei que lançar uma exceção é boa prática para deixá-lo borbulhar de volta para a interface do usuário ou em algum lugar onde você log a exceção e notificar o usuário sobre isso.
Por que o ReSharper dizem que é redundante?
try
{
File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
throw;
}
Solução
Como
try {
File.Open("FileNotFound.txt", FileMode.Open);
} catch {
throw;
}
não é diferente de
File.Open("FileNotFound.txt", FileMode.Open);
Se a chamada para File.Open(string, FileMode)
falhar, então em qualquer amostra exatamente a mesma exceção vai encontrar o seu caminho até a interface do usuário.
Nesse cláusula catch
acima, você está simplesmente captura e re-lançar uma exceção sem fazer qualquer outra coisa, tais como a exploração madeireira, reverter uma transação, envolvendo a exceção para adicionar informações adicionais a ele, ou qualquer outra coisa.
No entanto,
try {
File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
GetLogger().LogException(ex);
throw;
}
não contém quaisquer redundâncias e ReSharper não deve reclamar. Da mesma forma,
try {
File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
throw new MyApplicationException(
"I'm sorry, but your preferences file could not be found.", ex);
}
Não seria redundante.
Outras dicas
Porque a declaração acima tem o mesmo comportamento como se ele não estivesse lá. Mesmo que escrever:
File.Open("FileNotFound.txt", FileMode.Open);
Como o código na tentativa já é lançar a exceção.
Você só quer pegar e re-lançar a exceção se você estiver indo para fazer outra coisa no bloco catch, além de re-lançar a exceção.
Porque é redundante.
Você não fez qualquer processamento no bloco catch, apenas jogado a exceção novamente.
Ele avisa porque não há nenhum ponto em ter que bloco try ... catch lá.
Além disso, outra boa dica é que "jogar ex" não vai preservar o rastreamento de pilha, mas "jogar" vontade.
É importante notar que, enquanto ...
try
{
DoSomething();
}
catch
{
throw;
}
... é reduntant, o seguinte não é ...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
Este segundo trecho de código era abundante através de uma base de código eu herdei alguns projectos atrás e tem o efeito desagradável de se esconder rastreamento de pilha da exceção original. Lançar a exceção de que você acabou de pegar neste meio modo que a parte superior do rastreamento de pilha está no nível throw
, sem mencionar DoSomething
ou qualquer chamadas de método aninhadas realmente causou a exceção.
código de depuração Boa sorte que faz isso!