2010-07-09 70 views
3

异常处理的整个概念让我头痛。目前,我想要做的是处理特定的例外情况,我肯定我可以处理。另一方面,如果抛出一个我不知道如何处理的异常,我想终止该应用程序。当我在我的源代码中放置try-catch块时,它看起来很丑,因为它们中有很多。是否存在全局异常处理机制,例如一旦抛出未处理的异常就会触发事件?这样我就可以向用户显示错误消息并终止应用程序,而不是在我的源代码中反复重复这个过程。.NET中的全局异常处理?

P.S.我想在这种情况下终止应用程序,因为恐怕一旦抛出未处理的异常,程序可能会不正常地运行。

回答

2

至少在C#中,你可以指定一个全球性的 “未处理的异常处理” 。为此,您需要为AppDomain.CurrentDomain.UnhandledException分配一个新的处理程序。

+0

我看到事件处理程序终止了这个过程。我想显示一个用户控件并让它终止应用程序,但用户控件未显示。我唯一能够展示的是一个消息框。 – user246392 2010-07-09 08:45:59

+0

您可以尝试在显示视图的主窗口上调用公共方法,但我不确定这是否可行。 IIRC在事件参数中有一个标志,您可以使用它来确定应用程序是否应该退出。 – 2010-07-09 08:55:26

+0

公共方法只有当它有一个消息框时才起作用。看起来消息框是特殊的。另外,e.isTerminating是只读的。 – user246392 2010-07-09 09:10:02

0

你在建造一个赢的表格应用程序或一个网络应用程序?我在自定义Health Monitor上写了一篇博客文章,您可以向数据库提交异常。然后在Application_Error方法中添加这样的代码。

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
    ''# Code that runs when an unhandled error occurs 
    Dim exception As Exception = HttpContext.Current.Server.GetLastError() 
    Dim emailerrors As Boolean = If(LCase(AppSettings.GetAppValue("EmailErrors")) = "yes", True, False) 
    HealthMonitor.Log(exception, emailerrors) 
End Sub 

这将完成是陷阱每未处理的错误(IE:。你的try/catch之外,记录他们从那里(我重定向),你可以停止你的应用程序,或做任何你喜欢的错误

+0

我正在构建一个WPF应用程序,但我在Win窗体中有经验。 – user246392 2010-07-09 08:10:56

3

在VB.NET,你需要处理My.Application.UnhandledException事件:

例(从MSDN):

Private Sub MyApplication_UnhandledException(_ 
    ByVal sender As Object, _ 
    ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs _ 
) Handles Me.UnhandledException 
    My.Application.Log.WriteException(e.Exception, _ 
     TraceEventType.Critical, _ 
     "Unhandled Exception.") 
End Sub