Até agora, eu apenas coloquei um bloco try / catch em torno de Application.Run
no Program.cs
ponto de entrada do programa. Isso captura todas as exceções bem o suficiente no modo de depuração, mas quando executo o programa sem o modo de depuração, as exceções não são mais tratadas. Recebo a caixa de exceção não tratada.
Eu não quero que isso aconteça Quero que todas as exceções sejam detectadas ao executar no modo de não depuração. O programa tem vários threads e, de preferência, todas as exceções deles são capturadas pelo mesmo manipulador; Quero registrar exceções no banco de dados. Alguém tem algum conselho sobre como fazer isso?
fonte
No NET 4, certas exceções não são mais detectadas por padrão; estes tendem a ser exceções que indicam um estado corrompido (possivelmente fatal) do executável, como AccessViolationException.
Tente usar a tag [HandleProcessCorruptedStateExceptions] antes de seu método principal, por exemplo
using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions [HandleProcessCorruptedStateExceptions] public static int Main() { try { // Catch any exceptions leaking out of the program CallMainProgramLoop(); } catch (Exception e) // We could be catching anything here { System.Console.WriteLine(e.Message); return 1; } return 0; }
fonte
AppDomain.CurrentDomain.UnhandledException
eApplication.ThreadException
também com[HandleProcessCorruptedStateExceptions]
tag?Um bom exemplo pode ser encontrado em http://www.csharp-examples.net/catching-unhandled-exceptions/ Basicamente, mude seu principal para:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new Form1()); } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception"); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception"); }
fonte
Você pode usar a biblioteca NBug para isso. Com configuração mínima como esta:
NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException;
Você pode começar a coletar informações sobre todos os bugs não tratados em seu aplicativo, mesmo quando ele está implantado nos clientes. Se você não quiser usar uma biblioteca de terceiros, você deve anexar aos eventos abaixo:
// These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1());
fonte
Check Online for a Solution
OuClose the Program
... etc. Mas se eu NÃO assinar, recebo a exceção genérica normal do .NET não tratada Janela. Isso acontece nas compilações Release e Debug, também tentei configurarApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Não altera nada.