【问题标题】:Global exception handling in .NET?.NET 中的全局异常处理?
【发布时间】:2010-07-09 08:02:53
【问题描述】:

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

附:我想在这种情况下终止应用程序,因为我担心一旦引发未处理的异常,程序可能会开始无法正常运行。

【问题讨论】:

    标签: exception-handling


    【解决方案1】:

    在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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我看到事件处理程序杀死了进程。我想显示一个用户控件并让它终止应用程序,但未显示用户控件。我唯一能显示的是一个消息框。
      • 您可以尝试在显示视图的主窗口上调用公共方法,但我不确定这是否可行。 IIRC 事件的参数中有一个标志,您可以使用它来确定应用程序是否应该退出。
      • 公共方法只有在它有一个消息框时才有效。似乎消息框很特别。此外,e.isTerminating 是只读的。
      • 我还建议这样做并将此异常记录到某些第三方服务。我致力于以下 oss 项目:github.com/exceptionless/Exceptionless
      【解决方案3】:

      您是在构建 win forms 应用程序还是 Web 应用程序?我在自定义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 之外的错误并记录它们。从那里(我重定向)您可以停止您的应用程序,或做任何您喜欢的事情。

      【讨论】:

      • 我正在构建一个 WPF 应用程序,但我有 Win Forms 方面的经验。
      猜你喜欢
      • 2016-11-03
      • 2019-07-18
      • 2017-02-24
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2011-09-29
      • 2011-06-17
      相关资源
      最近更新 更多