gpt4 book ai didi

vba - 在本地处理预期错误的模式,重新抛出意外错误

转载 作者:行者123 更新时间:2023-12-04 00:58:38 25 4
gpt4 key购买 nike

有时,某些代码会以预期的方式引发错误,在本地处理它最方便,而不是将它扔到错误处理例程中,在那里它会与其他相同类型的错误混淆。然而你不希望意外的错误被吞下;你希望他们像往常一样长大。

在下面(稍微做作的)示例中,FindInArray函数可以引发不同类型的错误。其中之一,ERR__ELEMENT_NOT_FOUND_IN_ARRAY , 或多或少是预期的,所以我想在本地处理它。但也可能出现其他错误编号,如果是这样,我希望它们由错误处理例程处理。

我发现如果我在本地处理一些预期的错误号,我不能轻易地“重新抛出”要在其他地方处理的意外错误号。

如何将要在本地处理的预期错误与要在错误处理例程(或其他地方)中处理的意外错误分开?

On Error GoTo ErrorHandler

'Some code...

'Here I want to trap a likely/expected error locally, because the same
'error may occur elsewhere in the procedure but require different handling.
On Error Resume Next
personIndex = FindInArray(personName, personArray)
If Err.Number = ERR__ELEMENT_NOT_FOUND_IN_ARRAY Then
MsgBox "Name not found in person array. Using default person."
Else
'What if it's a different kind of error?
' .e.g. ERR__ARRAY_CONTAINS_TWO_PERSONS_WITH_SAME_NAME
'I want to rethrow it, but can't because On Error Resume Next swallows it.
End If
On Error GoTo ErrorHandler 'back to normal
'I can't rethrow it here either, because On Error Goto cleared the Err object.

'-----------------------
ErrorHandler:
Select Case Err.Number
Case ERR__ELEMENT_NOT_FOUND_IN_ARRAY
'The error number doesn't give me enough info
'to know what to do with it here!
Case ERR__ARRAY_CONTAINS_TWO_PERSONS_WITH_SAME_NAME
'Existing code to deal with this error
Case ...

我想我可以在其他一些变量/对象中“保存”错误编号、来源、描述等,并使用它们在 On Error GoTo ErrorHandler 'back to normal 之后引发错误。 ,(实际上我已经实现了这个只是为了看看)但这似乎非常不方便和笨拙。

最佳答案

我创建了一个用户定义的类型,它具有与 Err 相同的成员对象(编号、来源、描述等)。 SaveErr函数基本上会复制 Err 的值对象属性转换为这种类型的变量,和 RaiseSavedErr使用这些属性值会引发错误。

当然,完全相同的事情可以使用类和方法而不是用户定义的类型和函数/子来完成。但想法是一样的。

示例:

    On Error Resume Next
personIndex = FindInArray(personName, personArray)
savedErr = SaveErr(Err) 'Save values of Number, Source, Description, etc.
On Error GoTo ErrorHandler
'Segregate error handling strategies here using savedErr
If savedErr.Number = ERR__ELEMENT_NOT_FOUND_IN_ARRAY Then
MsgBox "Name not found in person array. Using default person."
Else
RaiseSavedErr savedErr 'rethrows the error
End If

我想知道是否有更标准或更优雅的方法来做到这一点。

关于vba - 在本地处理预期错误的模式,重新抛出意外错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com