Зачем ловить исключение, чтобы просто бросить его снова? - PullRequest
13 голосов
/ 03 декабря 2008

В веб-сервисе я вижу этот код:

<WebMethod()> _
Public Function dosomething() As Boolean
    Try
        If successful Then
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        Throw ex
    End Try
End Function

Какой смысл ловить исключение и просто бросать его снова? Я что-то пропустил?

Edit: Спасибо за ответы! Я думал, что это что-то в этом роде, но не был уверен, смогу ли я / рефакторинг их без каких-либо последствий.

Ответы [ 7 ]

43 голосов
/ 03 декабря 2008

Не делай этого.

Если вам абсолютно необходимо перебросить исключение, просто используйте throw;, используя throw ex;, стирает трассировку стека и абсолютно неверно.

14 голосов
/ 03 декабря 2008

Я не могу думать о причинах сделать это для функциональности. Однако это может произойти, когда ранее была некоторая обработка ошибок (обычно ведение журнала), которая была удалена, и разработчик удалил обработку журнала, но не реструктурировал код для удаления избыточной попытки / захвата.

5 голосов
/ 03 декабря 2008

Вероятно, немного кода осталось от отладки (вы бы установили точку останова на броске, чтобы вы могли исследовать исключение в отладчике). Я мог бы сделать что-то подобное, если бы захотел зарегистрировать исключение и затем передать его по цепочке, хотя я бы, вероятно, заключил исключение в другое с более значимым (для моего приложения) сообщением об ошибке.

4 голосов
/ 03 декабря 2008

Одна из архитектур (шаблоны проектирования) Я мог видеть, что это используется в том месте, где обрабатывается транзакция. Функция выполняет свою работу, происходит сбой, и блок catch завершает транзакцию до известного состояния (обычно откат) и затем генерирует пользовательское исключение.

В существующем виде переведите этот код в более нормальное состояние.

1 голос
/ 10 июня 2015

Не только бессмысленная попытка, но и ЕСЛИ. Вся функция может быть сведена к одной строке:

return successful

В какой момент, зачем? Почему бы просто не проверить «успешно» вместо вызова функции?

Ну, ладно, это веб-метод, я полагаю, вам нужна функция только для того, чтобы дать Ajax или кому-то еще справку.

(Да, я знаю, что мой ответ опоздал на 7 лет. Я просто наткнулся на это, когда искал что-то совершенно не связанное.)

0 голосов
/ 20 мая 2016

Шаблон для Monitor делает это очень вероятным, чтобы перебросить ошибку, так как вам нужен, наконец, чтобы Monitor.Exit называется

https://msdn.microsoft.com/en-us/library/4tssbxcw(v=vs.110).aspx

Dim lockObj As New Object()

If Monitor.TryEnter(lockObj) Then
    Try
        ' The critical section.
    Catch
       throw
    Finally
       ' Ensure that the lock is released.
       Monitor.Exit(lockObj)
    End Try
End If
0 голосов
/ 03 декабря 2008

Вы можете сделать это, если хотите поймать исключение, кроме его подкласса.

Например,

try {
    // Something stupid
}
catch(RuntimeException e) {
    throw e; //Handle it outside
}
catch (Exception e) {
    // I'm dead
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...