我即将重构一些旧的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?
答案 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