抛出的自定义异常会立即捕获到它所引发的同一个catch块

时间:2012-05-13 00:57:29

标签: vb.net exception exception-handling

这可能是一个调试器问题,但这里有:

我有这段代码:

Private Function Connect() As Boolean
    Try
        sessionBegun = False
        connectionOpen = False

        rp = New RequestProcessor2()

        rp.OpenConnection2("","EZSystem", QBXMLRPConnectionType.localQBD) 

        connectionOpen = True 
        ticket = rp.BeginSession("", QBFileMode.qbFileOpenDoNotCare)
        sessionBegun = True 

        Return True
    Catch e As COMException
        exceptionHandler.HandleConnectionException(e)
        **Throw New QuickBooksConnectionException(e.Message)**
    End Try
End Function

我的意图是将低级别异常“转换”为更有意义的异常,所以我抛出了自己创建的异常。我想让它泡到一个我可以处理它的地方。

然而,正在发生的事情是我的调试器中断并告诉我抛出了类型“QuickBooksConnectionException”的异常。

我知道,我只是扔了它,你为什么要抓住它?

从我读过的内容来看,这应该可行,并且似乎没有类似的Java throws关键字,所以也许它是我的调试器。

我正在使用SharpDevelop。

谢谢, 戴恩

3 个答案:

答案 0 :(得分:1)

如上所述,您的代码会抛出一个未处理的异常,这总是会导致调试器无法进行。您只需要在调用此方法的代码中捕获 QuickBooksConnectionException 。 (而且你是对的,C#中没有与 throws Java关键字相同的。)

答案 1 :(得分:1)

您可以更改调试器中断异常的设置。

See here.

答案 2 :(得分:0)

这只是调试器正在完成的工作。它通常会捕获任何未处理的异常。我认为你的代码运行正常,调试器可能让你感到困惑。

这是一个显示正在发生的事情的实验。完全删除Try-Catch块。运行代码&导致COMException。调试器将“捕获”它,因为它未处理,并突出显示抛出它的行。

异常冒泡调用堆栈,寻找封闭的Try块。如果没有封闭的Try块,则运行时会处理它。这意味着如果您在调试器下运行,调试器将回退调用堆栈,以便它可以显示抛出异常的原始行。帮助您调试异常发生的原因。尝试从没有调试器的独立EXE或网站运行。它将以标准错误对话终止。

以下是rules,用于确定调试器是否在异常中断。