0

看起来不可能,但是...

    Try
    Select Case command
            Case 1
              smth()
            Case 2
                If Not validSmth() Then
                    Throw New Exception(errMsg)
                Else
                   doSmth()
                End If
            Case 3
                doSmthElse()
            Case Else
                Throw New Exception(errMsg2)
        End Select
    Catch ex As Exception
        ProcessEx()
    End Try

首先Case 2运行。抛出异常。在这个调试器显示下一个处理的语句之后是Case Else. 只有在Case Else抛出自己的异常Catch块后才开始工作。我从来没有见过这种伎俩。为什么会发生这种情况?

我确定该块被输入一次(不是这样的:first enter hit Case 2and second hit Case Else)。

感谢您的任何想法。

更新:

——致马特·威尔科。谢谢你的回答。我已经切换到Strict OnVS2010 的选项,但没有任何改变。 Command是变量,不是函数。观察工具显示每一步Command都是相同的(Command= 2)。

回答

固定的。是啊啊啊。我将代码简化为

        Try
        Select Case 2
            Case 2
                Throw New Exception("123")
            Case Else
                Throw New Exception("345")
        End Select
    Catch ex As Exception
        wtf(ex.Message)
    End Try

并将项目更改为控制台应用程序。正如我所提到的,这很有效。修复在Release mode. 我正在调试Release mode. 当我切换到Debug mode一切正常时。

感谢大家的快速解答。

4

1 回答 1

2

我刚刚尝试了一个简单的示例来说明您所展示的内容,但对我来说它按预期工作。当抛出异常时,执行会直接跳转到Catch其他地方。输出显示“EX:2”。

我会设置更多断点以确保您不会输入两次代码。如果失败,请重新启动 Visual Studio(有时调试器会变得很奇怪)。我认为您描述的行为不可能发生。

Sub Main()

    Dim Command As Integer = 2
    Try
        Select Case Command
            Case 1
                Console.WriteLine("1")
            Case 2
                Throw New Exception("2")
            Case 3
                Console.WriteLine("3")
            Case Else
                Throw New Exception("ELSE")


        End Select
    Catch ex As Exception
        Console.WriteLine("EX:" & ex.Message)
    End Try

    Console.ReadLine()

End Sub
于 2012-06-19T15:32:54.207 回答