Wzorzec do obsługi oczekiwanych błędów lokalnie, powtórz nieoczekiwane błędy

Czasami pewien bit kodu wywołuje błąd w oczekiwany sposób i najwygodniej jest go obsługiwać lokalnie, zamiast rzucać go do procedury obsługi błędów, gdzie zostanie pomieszany z innymi błędami tego samego typu. Jednak nie chcesz, aby nieoczekiwane błędy zostały połknięte; chcesz, żeby zostały podniesione jak zwykle.

W (nieco wymyślonym) przykładzie poniżejFindInArray funkcja może powodować różne rodzaje błędów. Jeden z nich,ERR__ELEMENT_NOT_FOUND_IN_ARRAY, jest mniej lub bardziej oczekiwany i dlatego chcę go obsługiwać lokalnie. Ale mogą też pojawić się inne numery błędów, a jeśli tak, to chcę, aby zajęły się nimi procedury obsługi błędów.

Uważam, że jeśli mam do czynienia z pewnymi oczekiwanymi numerami błędów lokalnie, nie mogę łatwo „powtórzyć” nieoczekiwanych numerów błędów, aby można je było znaleźć gdzie indziej.

Jak segregować oczekiwane błędy, z którymi chcę się zmierzyć lokalnie, od nieoczekiwanych błędów, którymi należy się zająć w procedurze obsługi błędów (lub gdzie indziej)?

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 ...

Myślę, że mógłbym „zapisać” numer błędu, źródło, opis itp. W innej zmiennej / obiekcie i użyć tych, aby zgłosić błąd poOn Error GoTo ErrorHandler 'back to normal, (i tak naprawdę zaimplementowałem to tylko po to, by zobaczyć), ale to wydaje się strasznie niewygodne i niezdarne.

questionAnswers(4)

yourAnswerToTheQuestion