Pergunta

Eu tive recentemente para desenvolver um módulo adicional para um serviço já existente desenvolvido por um colega. Ele tinha colocado um bloco try / catch na função de trabalho principal para a captura de todas as exceções unhadled que borbulhava a este nível, registrando-los juntos com informações rastreamento de pilha etc:

try
{
    // do main work
}
catch(Exception ex)
{
    // log exception info
}

Enquanto isso torna o programa muito estável (como em 'improvável que Crash'), eu odeio isso porque quando eu estou testando meu código, eu não vejo as exceções causadas por ele. Claro que eu posso olhar para o log de exceção e ver se há novas entradas, mas eu muito preferem o feedback direto de obter a exceção do momento em que é lançada (com o cursor na linha direita no código, por favor).

I removido este nível superior tentativa / captura, pelo menos, enquanto ainda estava codificação e testar. Mas agora minha tarefa está acabado e eu tenho que decidir wether para colocá-lo de volta para a liberação, ou não. Eu acho que eu deveria fazê-lo, porque torna o serviço mais estável, e todo o ponto dele é que ele é executado em segundo plano, sem necessidade de qualquer supervisão. Por outro lado eu li que só se deve chamar exceções específicas (como no IoException), não genericamente Exception.

O que é o seu conselho sobre este assunto?

A propósito, o projeto é escrito em C #, mas eu também estou interessado em respostas para línguas não .NET.

Foi útil?

Solução

Coloque-o de volta.

A exceção deve ser apenas o teste enquanto relevante. Caso contrário, não faz sentido colocá-la para o usuário.

Logging é bom.

Você pode ainda usar o símbolo DEBUG definido pelo Visual Studio para depuração compilações como uma bandeira.

    ...
    } catch( Exception e ) { 
#if DEBUG
          throw;
#else
          log as usual 
#endif
    }

Assim, na próxima vez que uma modificação é necessária a bandeira de depuração deve ser definida como true e a exceção irá aparecer.

Outras dicas

Em qualquer aplicativo Java, você quase sempre quer definir um manipulador de exceção para exceções.Ele com algo parecido com isto:

Thread.setDefaultUncaughtExceptionHandler( ... );

onde o objeto que vai pegar essas exceções não identificadas, pelo menos, registrar a falha assim que você tem uma chance de saber sobre ele. Caso contrário, não há nenhuma garantia de que você vai mesmo ser notificado de que um segmento tomou uma exceção -. Não a menos que seja o seu segmento principal

Além de fazer isso, a maioria dos meus tópicos têm um try / catch onde eu vou pegar RunnableException (mas não Error) e registrá-lo ... alguns Threads vai morrer quando isso acontece, os outros vão fazer logon e ignorar, outros irá exibir uma queixa para o usuário e deixar o usuário decidir, dependendo das necessidades da aplicação. Esta tentativa / captura está na raiz da rosca, no método Runnable.run() ou equivalente. Desde o try / catch está na raiz da linha, não há nenhuma necessidade de, por vezes, desativar esta captura.

Quando eu escrever em C #, código I semelhante. Mas tudo isso depende da necessidade da aplicação. É a exceção que irá corromper os dados? Pois bem, não pegar e ignorá-lo. SEMPRE registrá-lo, mas, em seguida, deixar morrer a aplicação. A maioria das exceções não são deste tipo, no entanto.

Idealmente você quer manipular uma exceção como perto de onde ocorreu possível, mas isso não significa que um manipulador de exceção global é uma má idéia. Especialmente para um serviço que deve permanecer funcionando a todo custo. Gostaria de continuar o que você tem feito. Desativá-lo durante a depuração, mas deixá-lo no lugar para a produção.

Tenha em mente que deve ser usado como uma rede de segurança. Ainda tentam capturar todas as exceções antes de elevar a esse ponto.

O desejo de capturar todas as exceções e fazer o programa 'estável' é muito forte e a idéia parece muito atraente, na verdade a todos. O problema que você salientar é que este é apenas um ardil eo programa pode muito bem ser buggy e pior, w / o indicações de falhas. Ninguém monitora os registros regularmente.
Meu conselho seria para tentar convencer o outro desenvolvedor para fazer extensos testes e, em seguida, implantá-lo na produção w / o a captura externa.

Se você quiser ver a exceção quando ocorre, no Visual Studio você pode ir para o menu Debug, selecione exceções e você pode dizer o depurador para quebrar assim que uma exceção é lançada. Você mesmo começar a escolher que tipo de excepções. :)

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