winforms控件的全局异常处理

问题描述:

当处理ASP.NET 1.1项目时,我总是使用Global.asax来捕获所有错误。我正在寻找一种类似的方法来捕获Windows窗体用户控件中的所有异常,最终成为托管IE控件。什么是正确的方式去做这样的事情?winforms控件的全局异常处理

+0

另请参见[我的问题](http://stackoverflow.com/questions/944/unhandled-exception-handler-in-net-11)的一些陷阱(链接到一对夫妇编码恐怖博客条目)。 – Ray 2008-08-05 22:17:11

您需要处理Windows窗体的System.Windows.Forms.Application.ThreadException事件。这篇文章真的帮了我:http://bytes.com/forum/thread236199.html

如果您使用的是VB.NET,您可以使用非常方便的ApplicationEvents.vb。此文件免费提供一个VB.NET WinForms项目,并包含一个处理unhandled exceptions的方法。

为了得到这个漂亮的文件,它的“项目属性>>应用>>应用程序事件”

如果你不使用VB.NET,那么是的,它的操控性Application.ThreadException

目前在我的WinForms应用程序我有处理程序Application.ThreadException,如上所述,也AppDomain.CurrentDomain.UnhandledException

大多数例外通过ThreadException处理到达,但在AppDomain一个也抓了几个在我的经验

+3

来自MSDN的示例代码显示如何捕获这两种类型的未处理的异常:[msdn](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.threadexception.aspx) – 2011-07-14 00:43:26

代码从MSDN:http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

Sub Main() 
    Dim currentDomain As AppDomain = AppDomain.CurrentDomain 
    AddHandler currentDomain.UnhandledException, AddressOf MyHandler 

    Try 
    Throw New Exception("1") 
    Catch e As Exception 
    Console.WriteLine("Catch clause caught : " + e.Message) 
    Console.WriteLine() 
    End Try 

    Throw New Exception("2") 
End Sub 

Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs) 
    Dim e As Exception = DirectCast(args.ExceptionObject, Exception) 
    Console.WriteLine("MyHandler caught : " + e.Message) 
    Console.WriteLine("Runtime terminating: {0}", args.IsTerminating) 
End Sub 

在全球范围内处理异常...

Windows应用程序

System.Windows.Forms.Application.ThreadException事件

的主要方法一般使用。请参阅MSDN Thread Exception

Asp.Net

System.Web.HttpApplication.Error事件

在Global.asax文件中正常使用。请参阅MSDN Global.asax Global Handlers

控制台应用程序

System.AppDomain.UnhandledException事件

的主要方法一般使用。请参考MSDN UnhandledException