Many people think it's a no-op, but it's not. If you have this program:
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
The output is
No Catch
1
3
2
With Catch
3
1
2
Edit: One scenario when this actually matters this:
The Thrower and NoCatch functions are in the same assembly, which is thrusted. The Caller method is not trusted and malicious. Now imagine that the Thrower method uses WindowsIdentity to impersonate another user, which the untrusted assembly is not allowed to do. It then relies on a using block (= try/finally) to unimpersonate the user, but it throws an exception. This would mean that the malicious assembly runs as the impersonated user during the execution of the Filter method. Perhaps this will also work if asserting permissions, but I'm not sure.