我怎样才能在WinForms应用程序中捕获所有“未处理”的exception呢?

到目前为止,我只是在Application.RunProgram.cs入口点的Application.Run周围放置了一个try / catch块。 这在debugging模式下捕获了所有的exception,但是当我在没有debugging模式的情况下运行程序时,exception不再被处理。 我得到未处理的exception框。

我不想要这样的事情发生。 我希望在非debugging模式下运行时捕获所有exception。 该程序有多个线程,最好所有的exception都被同一个处理程序捕获。 我想在数据库中loggingexception。 有没有人有任何build议如何做到这一点?

看看ThreadException文档中的例子:

 public static void Main(string[] args) { // Add the event handler for handling UI thread exceptions to the event. Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); // Set the unhandled exception mode to force all Windows Forms errors // to go through our handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Add the event handler for handling non-UI thread exceptions to the event. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); } 

debugging时,您可能也不想捕捉exception,因为这样更容易debugging。 这是一个黑客,但为此,你可以包裹上面的代码

  if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... } 

防止在debugging时捕获exception。

在NET 4中,某些exception不再被默认捕获; 这些往往是exception,表明(可能致命的)可执行文件的损坏状态,如AccessViolationException。

尝试在主方法前面使用[HandleProcessCorruptedStateExceptions]标签,例如

 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; } 

你可以使用NBug库。 像这样最简单的设置:

 NBug.Settings.Destination1 = "Type=Mail;From=me@mycompany.com;To=bugtracker@mycompany.com;SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException; 

您可以开始收集应用程序中所有未处理错误的信息,即使将其部署到客户端也是如此。 如果你不想使用第三方库,你应该附加下面的事件:

 // These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1()); 

一个很好的例子可以在http://www.csharp-examples.net/catching-unhandled-exceptions/find。基本上,你的主要改变为:;

 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"); }