Sempre que um usuário relata um erro como
System.Runtime.InteropServices.SEHException - O componente externo lançou uma exceção?
há algo que eu, como programador, possa fazer para determinar a causa?
Cenário: um usuário (usando um programa que minha empresa escreveu) relatou este erro. Isso pode ou não ter sido um erro único. Eles mencionaram que no último mês, o computador 'parou de funcionar' duas vezes. Aprendi com a experiência a não interpretar essa descrição muito literalmente, pois geralmente significa que alguém que está se relacionando com o computador não está funcionando como esperado. Eles não puderam me fornecer mais detalhes e eu não consegui encontrar nenhum erro registrado. Portanto, pode ou não ter sido esse erro.
A partir do rastreamento da pilha, o erro real foi ao construir uma classe que não chama diretamente nenhum código de interoperabilidade, mas talvez complicado pelo fato de que o objeto pode fazer parte de uma lista que é ligada a um DevExpress Grid.
O erro foi 'detectado' por uma rotina de exceção não tratada que normalmente fecha o programa, mas tem a opção de ignorar e continuar. Se eles optaram por ignorar o erro, o programa continuou funcionando, mas o erro voltou a ocorrer na próxima execução dessa rotina. No entanto, isso não ocorreu novamente após fechar e reiniciar nosso aplicativo.
O computador em questão não parecia estressado. Ele está rodando o Vista Business, tem 2 GB de memória e de acordo com o Gerenciador de Tarefas estava usando apenas cerca de metade disso com nosso aplicativo apenas cerca de 200 Mb.
Existe uma outra informação que pode ou não ser relevante. Outra seção do mesmo programa usa um componente de terceiros que é efetivamente um wrapper dotnet em torno de uma dll nativa e este componente tem um problema conhecido onde, muito ocasionalmente, você obtém um
Tentativa de ler ou gravar memória protegida. Isso geralmente é uma indicação de que outra memória está corrompida
Os fabricantes de componentes dizem que isso foi corrigido na versão mais recente de seus componentes, que estamos usando internamente, mas isso ainda não foi fornecido ao cliente.
Dado que as consequências do erro são baixas (nenhum trabalho é perdido e reiniciar o programa e voltar para onde estava leva apenas um minuto no máximo) e dado que o cliente em breve receberá uma nova versão (com o terceiro atualizado componente de festa), obviamente posso cruzar os dedos e esperar que o erro não ocorra novamente.
Mas há algo mais que eu possa fazer?