Многие люди думают, что это не-опера, но это не так. Если у вас есть эта программа:
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
Edit: Один сценарий, когда это действительно имеет значение так: Функции Thrower и NoCatch находятся в одной и той же сборки, который ткнули. Метод Caller не является надежным и злонамеренным. Теперь представьте, что метод Thrower использует WindowsIdentity для олицетворения другого пользователя, которого недопустимая сборка не позволяет делать. Затем он полагается на используемый блок (= try/finally), чтобы исключить пользователя, но он выдает исключение. Это означает, что вредоносная сборка выполняется как олицетворенный пользователь во время выполнения метода фильтра. Возможно, это будет работать и при утверждении разрешений, но я не уверен.
Согласен.Это позволяет исключение, но код finally позволяет вам сделать что-то вроде закрытия соединения или отменить транзакцию, прежде чем передавать исключение обратно вызывающему процессу. – Bomlin
Этот ответ подразумевает, что вы должны иметь улов, чтобы иметь наконец-то, но это не так. :) – jsight
-1 по причине, указанной jsight –