Какой смысл в этом заявлении Catch?

Я видел это в устаревшем коде. Какова цель одиночного Броска в Улове, если таковой имеется?

       Try
           'Some Oracle access statement
       Catch err As OracleClient.OracleException
            Throw
       Finally
          'Do something
       End Try

Результат такой же, как если бы исходная ошибка не была обнаружена? Будете ли вы использовать оператор Throw без параметров, чтобы повторно выдать исходную ошибку, обычно после выполнения какого-либо действия в первую очередь?

7 ответов

Решение

Похоже, он используется для устранения ошибки. Хотя обычно в оператор catch добавляется больше, чем просто throw (т. Е. Ведение журнала, оповещения и т. Д.), В этом случае он позволяет использовать оператор finally для некоторой очистки, а затем вывести ошибку на следующий уровень. Без try / catch как этот код очистки будет написан в этой области? Как уже упоминалось, синтаксис throw (без ex) сохраняет трассировку стека.

Я часто использовал этот шаблон при отладке; Я установлю точку останова в операторе throw, чтобы я мог проверить err, Не уверен, что есть еще одна веская причина для этого.

Многие люди думают, что это неоперация, но это не так. Если у вас есть эта программа:

Module Module1
    Function Filter() As Boolean
        Console.WriteLine("1")
        Return True
    End Function

    Sub Thrower()
        Try
            Throw New Exception("x")
        Finally
            Console.WriteLine("3")
        End Try
    End Sub

    Sub NoCatch()
        Try
            Thrower()
        Finally
            Console.WriteLine("2")
        End Try
    End Sub

    Sub WithCatch()
        Try
            Thrower()
        Catch ex As Exception
            Throw
        Finally
            Console.WriteLine("2")
        End Try
    End Sub

    Sub Caller(ByVal method As Action)
        Try
            method()
        Catch ex As Exception When Filter()
        End Try
    End Sub

    Sub Main()
        Console.WriteLine("No Catch")
        Caller(AddressOf NoCatch)
        Console.WriteLine("With Catch")
        Caller(AddressOf WithCatch)
    End Sub
End Module

Выход

No Catch
1
3
2
With Catch
3
1
2

Редактировать: один сценарий, когда это действительно имеет значение: функции Thrower и NoCatch находятся в одной сборке, которая является надёжной. Метод Caller не является доверенным и вредоносным. Теперь представьте, что метод Thrower использует WindowsIdentity для олицетворения другого пользователя, что недопустимой сборке запрещено. Затем он использует блок using (= try/finally) для того, чтобы не выдавать себя за пользователя, но выдает исключение. Это будет означать, что вредоносная сборка запускается от имени пользователя во время выполнения метода Filter. Возможно, это также сработает, если вы предоставите права, но я не уверен.

Он ловит ошибку, а затем снова ее выдает. Я не вижу смысла, потому что вы можете сделать Try... Наконец, без предложения Catch...

Тем не менее, у jenningj есть хорошее замечание: его можно использовать для проверки ошибки с точкой останова, но она не должна появляться в рабочем коде.

Это было бы повторно выкинуть ту же ошибку. Это позволит вам выполнить работу в блоке "Наконец", в то время как выдает ошибку вызывающей стороне.

РЕДАКТИРОВАТЬ

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

Это ничего не делает. Брось как там правильно.

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

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

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

Другие вопросы по тегам