代码之家  ›  专栏  ›  技术社区  ›  JabbaWook

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

  •  0
  • JabbaWook  · 技术社区  · 10 年前

    我有一个与电子邮件交互的程序。我正在从升级 vb6 到 vb.net 。以前程序中有大量错误处理,使用 On Error 命令,以确保它从未中断,只是忽略并记录错误。在大多数功能中 出错时 代码,其中它通过返回默认值并退出函数来处理函数中的错误。例如:

    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 入口点,如下所示:

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

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

    因为程序中的任何错误都会以这种方式被捕获,我可以一次处理所有错误 尝试-捕捉 .

    然而,我意识到,这不会使上面的函数返回值 False 当发生错误时。如果我仍然需要此功能,我是否必须将所有内容打包 Try 阻碍?

    3 回复  |  直到 10 年前
        1
  •  2
  •   Assil    10 年前

    因为您担心的是不希望应用程序崩溃或中断,所以可以使用Try缓存块来解决这个问题。 然而,如果您正在讨论整个应用程序中的错误处理,那么我建议您考虑一种重构整个代码的方法。 删除所有“On Error”语句并应用一些新的逻辑来处理错误。 这种逻辑可能会有所不同(只有日志记录、重试策略设计模式等)。考虑所有预期的错误并相应地处理它们。

        2
  •  1
  •   Blackwood    10 年前

    如果您需要对特定函数中的错误进行特殊处理,那么该函数应该有自己的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
    
        3
  •  1
  •   Thomas Ehler    8 年前

    摆脱所有onError步骤,并进行全局错误处理

    在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 Array相应地响应每个错误。。