VisualBasic:将Exception强制转换为ErrObject

时间:2016-08-09 11:09:59

标签: vb.net exception error-handling try-catch

我即将重构一些旧的VisualBasic应用程序并且遇到以下情况:

Public Sub MySub ()
     Try
        ' execute dangerous operation
    Catch ex As System.Exception
        Call HandleErrors((ErrObject) ex)  ' <-- invalide cast
    End Try
End SuB

Public Sub HandleErrors(ByRef objError As ErrObject)   ' I can not easily change the signature of this sub as it gets referenced very often.
    ' process error ..
End Sub

我想重用已经存在的Sub'HandleErrors()',它将ErrObject作为参数。但是因为我更习惯使用Try和Catch,我想传递一个Syste.Exception类型的Object,而不是一个ErrObject。

问题

有没有办法将Exception转换或转换为ErrObject?

2 个答案:

答案 0 :(得分:1)

我认为这里更好的选择是创建一个HandleErrors的新重载,而不是试图强迫异常进入历史性的Visual Basic错误处理例程(保留原始子签名不会被仍然使用它的地方),可能有一个全新的功能,原始功能和新的重载都可以调用。例如,让我们假设您的函数目前看起来像这样:

Public Sub HandleErrors(ByRef objError As ErrObject)
    Log(objError.Description)
    PerformSomeGlobalCleanup()
End Sub

现在您也希望能够记录新式异常。你可以创建一个新的重载:

Public Sub HandleErrors(ByRef ex As Exception)
    Log(ex.Message)
    PerformSomeGlobalCleanup()
End Sub

但是这个代码分享HandleErrors实际正在做的事情的底层结构和逻辑会更好,所以你可以这样做:

Private Sub InternalHandleErrors(ByVal msg as String)
    Log(msg)
    PerformSomeGlobalCleanup()
End Sub

Public Sub HandleErrors(ByRef ex As Exception)
    InternalHandleErrors(ex.Message)
End Sub

Public Sub HandleErrors(ByRef objError As ErrObject)
    'original signature, but refactored
    InternalHandleErrors(objError.Description)
End Sub

您可以将原始HandleErrors中的逻辑从InternalHandleErrors移动到ErrObject,这是有道理的 - 处理Exception和{{1}}之间的常见问题。

这意味着您没有使用旧式Visual Basic对象“污染”新重构的代码,并且意味着如果/当您完成重构以在没有其他任何引用的情况下删除原始函数时,您不需要通过整个代码库删除演员表。

答案 1 :(得分:0)

好的,因为似乎没有简单的方法可以做到这一点,所以我决定重载HandleError Sub并引入一个新类来概括异常。

Public Sub MySub ()
     Try
        ' execute dangerous operation
    Catch ex As System.Exception
        Call HandleErrors((ErrObject) ex)  ' <-- invalide cast
    End Try
End SuB


Class GeneralError
    Public ReadOnly Number As Integer
    Public ReadOnly Source As String
    Public ReadOnly Description As String

    Sub New(exception As System.Exception)
        Number = 1
        Source = exception.Source
        Description = exception.Message
    End Sub

    Sub New(errObject As ErrObject)
        Number = errObject.Number
        Source = errObject.Source
        Description = errObject.Description
    End Sub
End Class

Public Sub HandleErrors(ByRef errObject As ErrObject)   ' Overload
    Dim generalError As GeneralError = New GeneralError(errObject )
    Call HandleErrors(generalError)
End Sub

Public Sub HandleErrors(ByRef exception As Exception)   ' Overload
    Dim generalError As GeneralError = New GeneralError(exception)
    Call HandleErrors(generalError)
End Sub


Private Sub HandleErrors(ByRef generalError As GeneralError)   ' Original
    ' process error ..
End Sub