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;
}
Foi útil?

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!

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