Перехватить, обработать, затем повторно выбросить исключение?

StackOverflow https://stackoverflow.com/questions/1050860

Вопрос

Сегодня я столкнулся с интересной дилеммой.У меня есть функция, которая обрабатывает информацию и проверяет наличие повторяющихся значений, а затем возвращает следующее число, которое не является дубликатом.Итак, у меня есть что-то вроде этого:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top