Иногда некоторый бит кода вызывает ошибку в ожидаемом режиме, и наиболее удобно обрабатывать его локально, а не бросать его в процедуру обработки ошибок, где она будет замешана с другими ошибками одного и того же типа. Однако вы не хотите, чтобы проглатывались непредвиденные ошибки; вы хотите, чтобы они были подняты, как обычно.
В примере (слегка надуманном) ниже функция 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 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
(и на самом деле я реализовал это просто, чтобы увидеть), но это кажется ужасно неудобным и неуклюжим.