我将重构一些旧的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 and Catch更方便,所以我想传递Syste.Exception类型的Object而不是ErrObject。

问题:

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

最佳答案

我认为,与其尝试将异常强加到历史悠久的Visual Basic错误处理例程中,不如将更好的选择是创建HandleErrors的新重载(使原始子签名在仍使用它的地方保持不变),可能是全新的然后可以调用原始函数和新重载的函数。例如,假设您的函数当前如下所示:

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中-在处理ErrObjectException之间是很常见的。

这意味着您不会用旧式的Visual Basic对象“污染”新重构的代码,并且意味着如果/当您完成重构以删除原始功能时,没有其他引用,您不需要遍历您的整个代码库都删除了强制类型转换。

09-25 22:55