コードの特定のビットが予期した方法でエラーを発生させることがありますが、同じタイプの他のエラーと混同されるエラー処理ルーチンにエラーをスローするよりも、ローカルで処理する方が最も便利です。それでも、予期しないエラーを飲み込みたくはありません。あなたは彼らをいつものように育てたいと思っています。
以下の (少し不自然な) 例では、FindInArray
関数はさまざまな種類のエラーを発生させる可能性があります。そのうちの 1 つである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
と思います(実際、これを確認するために実装しました)が、それはひどく不便に思えますそして不器用。