有没有一种简单的方法来捕获VB.NET应用程序中的所有异常?我有兴趣制作它,以便不是我的用户看到运行时错误,他们只是被告知发生错误并联系技术支持,然后记录相关的错误信息,以便我们的支持团队可以在事后查看它
答案 0 :(得分:3)
您可以使用OnUnhandledException
应用程序事件来捕获(几乎)代码未处理的每个异常。
在“项目属性”窗口(双击解决方案资源管理器上的项目文件或项目菜单 - > [项目名称]属性)上,“应用程序”页面有一个“查看应用程序事件”按钮,用于在项目中创建新文件
在该文件中,有一些事件在应用程序级别触发;其中之一是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。