Лови, обрабатывай, потом исключение Ретроу? - PullRequest
1 голос
/ 26 июня 2009

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

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 неправильном пути, или есть способ обойти это?

Ответы [ 2 ]

3 голосов
/ 27 июня 2009

Если вы поймали исключение и восстановились из него (с вашим IncrementToNonDuplicate ...), то больше нет причин для исключения. Код между catch и end try должен просто очистить ресурсы, такие как закрытие файла или устройства чтения данных, если вы перезапустите его.

Вы могли бы скорее вернуть структуру, которая содержит значение NonDuplicate и требуемую информацию об ошибках в функции. Другой способ - создать пользовательское исключение, которое будет содержать такую ​​информацию, как «Неверное число: это должно быть ...)

1 голос
/ 27 июня 2009

Вы можете вернуть логическое значение, указывающее, найден ли дубликат, и изменить параметр, передаваемый по ссылке, чтобы можно было обновить значение.

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean
...