- Namespace My
- ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可
- ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦
- ‘========================================================
- ‘以下事件可用于MyApplication:
- ‘ 启动:应用程序启动时,在创建启动窗体之前引发。
- ‘ 关闭:所有申请表格关闭后提出。 如果应用程序异常终止,则不会引发此事件。
- ‘ UnhandledException:如果应用程序遇到未处理的异常,则引发。
- ‘ StartupNextInstance:当启动单实例应用程序并且应用程序已经处于活动状态时引发。
- ‘ NetworkAvailabilityChanged:当网络连接连接或断开连接时引发。
- Partial Friend Class MyApplication
- ‘我们捕捉到的全局例外之一是不是线程安全的,所以我们需要首先使其线程安全。
- Private Delegate Sub SafeApplicationThreadException(ByVal sender As Object,ByVal e As Threading.ThreadExceptionEventArgs)
- Private Sub ShowDebugOutput(ByVal ex As Exception)
- ‘显示输出错误的From窗体
- Dim frmD As New Form2()
- ‘显示解决方案名
- frmD.TextBox1.AppendText("Product Name:" & My.Application.Info.ProductName & vbNewLine)
- ‘显示当前版本号
- frmD.TextBox1.AppendText("Product Version:" & My.Application.Info.Version.ToString() & vbNewLine)
- frmD.TextBox1.AppendText("OS Name:" & My.Computer.Info.OSFullName & vbNewLine)
- frmD.TextBox1.AppendText("OS Version:" & My.Computer.Info.OSVersion & vbNewLine)
- ‘NET2.0下判断x86还是64
- If Environment.GetEnvironmentVariable("ProgramFiles(x86)") = "" Then
- frmD.TextBox1.AppendText("OS Platform:x86" & vbNewLine)
- Else
- frmD.TextBox1.AppendText("OS Platform:x64" & vbNewLine)
- End If
- frmD.TextBox1.AppendText("--------------------" & vbCrLf)
- ‘显示错误
- frmD.TextBox1.AppendText(ex.ToString())
- frmD.ShowDialog()
- ‘执行应用程序清理
- ‘TODO: 在这里添加您的应用程序清理代码。
- ‘退出应用程序 - 或尝试从异常中恢复:
- Environment.Exit(0)
- End Sub
- Private Sub MyApplication_Startup(ByVal sender As Object,ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
- ‘ 有三个地方可以捕获所有全球未处理的异常:
- ‘ AppDomain.CurrentDomain.UnhandledException event。
- ‘ System.Windows.Forms.Application.ThreadException事件。
- ‘ MyApplication.UnhandledException事件。
- AddHandler AppDomain.CurrentDomain.UnhandledException,AddressOf AppDomain_UnhandledException
- AddHandler System.Windows.Forms.Application.ThreadException,AddressOf app_ThreadException
- End Sub
- Private Sub app_ThreadException(ByVal sender As Object,ByVal e As Threading.ThreadExceptionEventArgs)
- ‘这不是线程安全的,所以使其线程安全。
- If MainForm.Invokerequired Then
- ‘调用主线程
- MainForm.Invoke(New SafeApplicationThreadException(AddressOf app_ThreadException),New Object() {sender,e})
- Else
- ShowDebugOutput(e.Exception)
- End If
- End Sub
- Private Sub AppDomain_UnhandledException(ByVal sender As Object,ByVal e As UnhandledExceptionEventArgs)
- ShowDebugOutput(DirectCast(e.ExceptionObject,Exception))
- End Sub
- Private Sub MyApplication_UnhandledException(sender As Object,e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
- ShowDebugOutput(e.Exception)
- End Sub
- End Class
- End Namespace