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私はこのトリックを見たことがありません。なぜこれが起こったのですか?

私は、ブロックが一度入力されていると確信しています(このようではありません:最初にヒットCase 2し、2番目にヒットし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」です。

コードを 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 に答える