vb.net - 主要方法或每个方法的错误处理

vb.net - error handling on main method or every method

我有一个与电子邮件交互的程序。我正在将它从 vb6 升级到 vb.net。之前程序中有大量的错误处理,使用 On Error 命令,以确保它永远不会中断,只是忽略并记录错误。在大多数函数中都有这个 On Error 代码,它通过 return 设置默认值并退出函数来处理函数中的错误。例如:

Public Function Init() As Boolean
    On Error GoTo Err_Init
    Init = True
Exit_Init: 
    Exit Function 
Err_Init:
    Init = False
    Resume Exit_Init
End Function

我想将所有错误处理更改为 Try - Catch 块。当我升级 vb6 代码时,我最初的想法是在 Sub Main 入口点周围用一个简单的 Try - Catch 替换所有错误处理,如下所示:

Public Sub Main()
    Try
        Init()
    catch
        'do stuff
    end try
End Sub

public function Init() As boolean
    init = true
end function 

因为程序中的任何错误都将以这种方式捕获,我可以一次处理它们 Try - Catch

但是我后来意识到,当发生错误时,这不会使 return 上面的函数成为 False 的值。如果我仍然想要此功能,是否必须将所有内容包装在 Try 块中?

如果您需要对特定函数中的错误执行一些特殊操作,那么该函数应该有自己的 Try/Catch 块来实现该行为。例如:

Public Function Init() As Boolean
    Try
        'Presumably some other code goes here
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

既然您担心的是您不希望应用程序崩溃或中断,是的,您可以使用 Try cache block 来解决这个问题。 但是,如果你在谈论整个应用程序的错误处理,那么我建议你想办法重构整个代码。 删除所有 "On Error" 语句并应用一些新逻辑来处理错误。 该逻辑可能会有所不同(仅日志记录、重试策略设计模式等)考虑所有预期的错误并相应地处理它们。

去掉所有的 on Error 步骤,进行全局错误处理

在main_load下面放三个方块

       ' Get your application's application domain for error handling.
    Dim currentDomain As AppDomain = AppDomain.CurrentDomain

    ' Define a handler for unhandled exceptions.
    AddHandler currentDomain.UnhandledException, AddressOf MYExnHandler

    ' Define a handler for unhandled exceptions for threads behind forms.
    AddHandler Application.ThreadException, AddressOf MYThreadHandler

然后添加如下所示的两个子例程

Private Sub MYExnHandler(ByVal sender As Object,
   ByVal e As UnhandledExceptionEventArgs)

    Dim EX As Exception
    EX = e.ExceptionObject
    If EX.StackTrace.Contains("SOMETHING") Then
        My.Computer.FileSystem.WriteAllText(LogToWrite, "Error SOMETHING caught:" & EX.StackTrace & vbCrLf, True, System.Text.Encoding.Default)
        MsgBox("error caught. Contact **XXX** for assistance!" & vbCrLf & vbCrLf & "Error: " & vbCrLf & EX.StackTrace,, "Fatal Error")
    End If
End Sub

Private Sub MYThreadHandler(ByVal sender As Object,
 ByVal e As Threading.ThreadExceptionEventArgs)
    If e.Exception.StackTrace.Contains("SOMETHING") Then
        My.Computer.FileSystem.WriteAllText(LogToWrite, "Error SOETHING caught:" & e.Exception.StackTrace & vbCrLf, True, System.Text.Encoding.Default)
        MsgBox("Error caught. Contact **xxx** for assistance!" & vbCrLf & vbCrLf & "Error: " & vbCrLf & e.Exception.StackTrace,, "Fatal Error")
    End If
End Sub

您可以只检查错误的内容并使用 Case 数组对每个错误做出相应的响应..