通用异常处理程序

时间:2015-09-18 16:28:17

标签: vb.net exception-handling

有没有一种简单的方法来捕获VB.NET应用程序中的所有异常?我有兴趣制作它,以便不是我的用户看到运行时错误,他们只是被告知发生错误并联系技术支持,然后记录相关的错误信息,以便我们的支持团队可以在事后查看它

4 个答案:

答案 0 :(得分:3)

您可以使用OnUnhandledException应用程序事件来捕获(几乎)代码未处理的每个异常。

在“项目属性”窗口(双击解决方案资源管理器上的项目文件或项目菜单 - > [项目名称]属性)上,“应用程序”页面有一个“查看应用程序事件”按钮,用于在项目中创建新文件

application event button

在该文件中,有一些事件在应用程序级别触发;其中之一是UnhandledException。无论您放置什么,都将执行而不是经典的JIT对话框。 UnhandledExceptionEventArgs对象具有Exception属性,其中包含未处理的异常对象,以及ExitApplication属性,用于确定应用程序是应该退出还是继续执行。

Namespace My

    ' The following events are available for MyApplication:
    ' 
    ' Startup: Raised when the application starts, before the startup form is created.
    ' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
    ' UnhandledException: Raised if the application encounters an unhandled exception.
    ' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
    ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
    Partial Friend Class MyApplication
        Private Sub MyApplication_UnhandledException(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
            MessageBox.Show(e.Exception.ToString) '<-- the exception object
            e.ExitApplication = True '<-- True if you want the application to close; false to continue - if it can
        End Sub
    End Class

End Namespace

请注意,即使使用此方法(例如内存不足),仍有一些“超级异常”无法捕获,但这样您就可以记录代码中未正确处理的异常,或者在开始时没有考虑的实际情况是什么情况。

更多信息here

作为旁注:不要过分依赖此事件。这必须是非常特殊的情况,因为这里捕获的内容应该在相应的类/模块/方法中尽快处理。这是一个用于调试和测试用例的有用工具,但是由于此事件处理了太多异常,这将代表您的代码出错。

答案 1 :(得分:1)

这取决于运行应用程序的环境。如果您使用的是WPF或WinForms,则可以使用main方法启动应用程序,而不是直接启动表单或页面。然后,您的main方法应该包装调用以在try catch块中实例化UI。

因此,对于WinForms应用程序,您可以执行以下操作:

Sub Main
  Try
    Dim MainUI As New Form1
    MainUI.Show()
    Application.Run
  Catch ex As Exception
    'Do that fancy exception processing
  End Try
End Sub

你可以用WPF做类似的事情。但是,WPF还支持一个事件模型,在这个事件模型中,您会收到异常通知,这与ASP.Net使用的非常类似。

答案 2 :(得分:0)

您永远无法捕获StackOverflowException。

所有其他人肯定是的。我不熟悉VB,但在C#中很容易实现。对于VB,我认为通用的exeption处理程序可能是

Try
    ...
Catch e As Exception
    ...
End Try

当然这必须包装你的所有代码。您可以找到更多示例here

答案 3 :(得分:0)

如果您有表单应用程序,那么将/tmp/log周围的处理程序作为唯一的事件处理程序是不切实际的。保持它,但还添加另外两个:

当在表单内部并且发生异常时,您希望在该上下文中继续执行 - 保持表单打开等。为此,请使用ThreadExceptionEventHandler

此外,如果应用程序无法解决某些问题,请在Dispatcher.UnhandledException事件中添加处理程序。这是在应用程序结束之前执行的最后一件事。您可以将异常记录到磁盘以供以后调查等。非常有用。

让我们看一些好资源how they are applied