Какой смысл в этом заявлении 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, чтобы разбить исключения оракула, что гораздо проще, чем добавлять точки останова повсюду.