Qual é a melhor maneira de coletar / relatar erros inesperados em aplicativos .NET janela?

StackOverflow https://stackoverflow.com/questions/110488

Pergunta

Eu estou procurando uma solução melhor do que o que temos atualmente para lidar com erros produção inesperada , sem reinventar a roda.

Um número maior de nossos produtos são aplicações WinForm e WPF que estão instalados em locais remotos. Inevitavelmente erros inesperados ocorrem, de NullReferenceExceptions a 'erros de rede gerais'. Assim vão desde erros programador para os problemas do ambiente.

Atualmente todos estes exceções não tratadas são registrados usando log4net e, em seguida, enviado de volta para nós para Análise . No entanto, descobrimos que às vezes essas erro 'relatórios' contêm muito pouca informação para identificar o problema.

Nesses relatórios precisamos de informações, tais como:

  1. Nome do aplicativo
  2. Versão do aplicativo
  3. Workstation
  4. Talvez uma captura de tela
  5. Detalhes da exceção
  6. O sistema operacional
  7. RAM disponível
  8. Running processos
  9. E assim por diante ...

Eu realmente não quero re-inventar a roda, desenvolvendo este a partir do zero. Componentes que são necessários:

  1. coleção de erro (detalhes como mencionado acima)
  2. Erro 'emissor' (Queuing necessário se DB ou Internet está disponível)
  3. banco de dados Erro
  4. Análise e relatórios desses erros. Por exemplo. 10 a maioria dos erros ou o tempo limite freqüentes ocorrem 16:00 - 17:00. Como os erros de comparar entre a versão x e y?

Nota: Nós olhamos smartassembly como uma solução possível, mas embora perto não bastante satisfeitas as nossas necessidades e eu estava esperando para ouvir o que outros desenvolvedores fazer e se existem algumas alternativas.

Editar: Obrigado pelas respostas até agora. Talvez eu não estava claro na minha pergunta original, o problema não é a forma de capturar todas as exceções unhanded mas sim como lidar com eles e criar um mecanismo de relatório (análise) em torno deles.

Foi útil?

Solução

Eu sugiro o artigo de Jeff Atwood sobre usuário Exceção amigável Handling , que faz a maior parte do que você já pedir (Aplicação Info, tela, Exception Detalhes, oS, Logging para arquivos de texto e e-mail), e contém o código-fonte para que você adicione o material extra que você precisa.

Outras dicas

Você pode anexar ao evento exceção não tratada e log-lo / atingiu um webservice / etc.

[STAThread]
static void Main() 
{
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
    Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{
    // Log
}

Eu também encontrei este trecho de código usando AppDomain em vez de ThreadException:

static class EntryPoint {
    [MTAThread]
    static void Main() {
        // Add Global Exception Handler
        AppDomain.CurrentDomain.UnhandledException += 
            new UnhandledExceptionEventHandler(OnUnhandledException);

        Application.Run(new Form1());
    }

    // In CF case only, ALL unhandled exceptions come here
    private static void OnUnhandledException(Object sender, 
        UnhandledExceptionEventArgs e) {
        Exception ex = e.ExceptionObject as Exception;
        if (ex != null) {
            // Can't imagine e.IsTerminating ever being false
            // or e.ExceptionObject not being an Exception
            SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating);
        }
    }
}

Aqui está alguma documentação sobre isso: AppDomain não tratada exceção

Fora de apenas lidar com ele mesmo, não há realmente uma maneira genérica para fazer isso que é reutilizável, ele realmente precisa ser integrado com a interface do aplicativo corretamente, mas você poderia configurar um webservice que leva o nome do aplicativo, exceção, e todas essas coisas boas e têm um ponto centralizado para todos os seus aplicativos.

Você pode querer estudar o recurso de relatório de erro embutido de JetBrain Omea Leitor . Tem um pega-tudo componente de tratamento de erro que aparece uma caixa de diálogo quando ocorre um erro inesperado. A entrada do usuário pode obter mais detalhes antes de apresentar o problema ao serviço web erro de coleta pública de JetBrain.

Eles fizeram Omea código aberto para permitir que a comunidade para atualizar a base de código .NET 1.1 para v2 ou 3. http://www.jetbrains.net/confluence/display/OMEA/this+ ligação

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