这个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

上一篇: What is the point of this Catch statement?

下一篇: The difference between re