这个Catch声明有什么意义?
我在旧版代码中看到了这一点。 如果有的话,单个投掷的目的是什么?
Try
'Some Oracle access statement
Catch err As OracleClient.OracleException
Throw
Finally
'Do something
End Try
结果是否与原始错误未被捕获一样? 您会使用Throw语句不带参数来重新抛出原始错误,通常是在首先执行某些操作之后?
它看起来像是用来冒泡的错误。 虽然在这种情况下,通常会在catch语句中放置更多的内容,而不仅仅是抛出(即日志记录,警报等),它允许使用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
编辑:一个场景,当这实际上很重要:投掷者和NoCatch功能是在相同的大会,这是推测。 呼叫方法不受信任和恶意。 现在设想Thrower方法使用WindowsIdentity来冒充另一个用户,而不信任的程序集不允许这样做。 然后它依靠一个使用块(= try / finally)来取消模拟用户,但它会抛出一个异常。 这意味着恶意程序集在执行Filter方法期间作为模拟用户运行。 也许这也将工作,如果断言的权限,但我不知道。
链接地址: http://www.djcxy.com/p/79851.html