Перехватить, обработать, затем повторно выбросить исключение?
-
20-08-2019 - |
Вопрос
Сегодня я столкнулся с интересной дилеммой.У меня есть функция, которая обрабатывает информацию и проверяет наличие повторяющихся значений, а затем возвращает следующее число, которое не является дубликатом.Итак, у меня есть что-то вроде этого:
Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long
//the non-duplicate the function will return
Dim NonDuplicate as Long
If CheckForDuplicate(NumberToCheck) = True Then
Throw New DuplicateException()
Else
NonDuplicate = NumberToCheck
End If
End Function
Затем в нижней части функции у меня есть блок catch, который обрабатывает дубликат, увеличивая его до тех пор, пока у меня не останется дубликата, например:
Catch ex as DuplicateException
NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck)
Throw ex
Return NonDuplicate
End Function
Как видите, я хочу конкретно обработать это исключение, но я также хочу выбросить его, когда закончу, потому что я хочу предупредить другой код вне функции.
Проблема в том, что просто выкинув его, мы выходим из функции с помощью null
ценить.Думаю ли я о try/catch
неправильный путь, или есть способ обойти это?
Решение
Если вы поймали исключение и восстановились от него (с помощью IncrementToNonDuulate...), то больше нет причин создавать исключение.Код между catch и end try должен просто очищать ресурсы, например закрывать файл или устройство чтения данных, если вы его повторно создадите.
Вы можете скорее вернуть структуру, содержащую значение NonDuplate и необходимую информацию об ошибках в функции.Другой способ — создать собственное исключение, которое будет содержать такую информацию, как «Неверный номер:должен быть...)
Другие советы
Вы можете вернуть логическое значение, указывающее, найден ли дубликат, и изменить параметр, передаваемый по ссылке, чтобы обновить значение.
Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean