3

次の単純なコンソール アプリケーションについて考えてみましょう。

using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            throw new Exception();
        }
    }
}

これを Visual Studio 2010 または Visual Studio 2012 Beta のデバッガーで実行します。

そうすると、当然、デバッガーは例外で停止します。わかりました。

しかし、F5 キーを押して続行 (または [Debug]、[Continue] の順に選択) すると、同じ例外で再び停止します。プログラムを終了するには、デバッグを停止する必要があります。F5 を押したときにプログラムが終了することを期待していました。

なぜそれがそのように振る舞うのか誰かが知っていますか?

[編集]

返信を回答としてマークしましたが、デバッガーの動作の奇妙な結果を確認するには、次のコードを検討してください。

using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            throw new Exception();
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Console.WriteLine("Unhandled Exception.");
        }
    }
}

これをデバッガーで実行し、F5 キーを何度も押してから、出力を確認します。コードが実際にスローするのは 1 回だけですが、多くの「未処理の例外」メッセージが表示されます。デバッガーが原因で例外が複数回スローされています! これは私が奇妙に思うことです。

4

4 に答える 4

5

何を期待しましたか?

次の方法を検討してください。

private void Test()
{
    throw new Exception();  
    int u = 4;
}

例外がスローされると、デバッガーを使用して呼び出し元のコンテキストに移動し、プログラムが例外をキャッチするかどうかを確認できます。そうでない場合はTest、例外をスキップしてメソッドを終了することはありません。そのため、int u = 4;到達不能です。

あなたの例では、それは同じです:

private static void Main(string[] args)
{
    throw new Exception();

    // If I'm here, I will exit the application !
    // But this place is unreachable
}

Main例外のため、メソッドスコープを終了することはできません。そのため、F5を使用してデバッグしているときにアプリケーションを終了することはできません。

デバッガーが接続されていない場合、処理されていない例外が原因でアプリケーションがクラッシュすることはもちろんですが、これは別の話です。

于 2012-07-13T11:51:56.123 に答える
1

それはしません。アプリケーションがデバッガーで実行されていなかった場合、「アプリケーションが予期せず終了しました」というダイアログが表示されますが、VisualStudioでは表示されません。

なぜそのように動作するのか正確にはわかりませんが、「現在実行中の行」の矢印(黄色の配列)を実行すべき次の行に移動して操作を再開するオプションが提供されているためかもしれません。

それ以外の場合は、はい、アプリケーションを明示的に停止する必要があります。

于 2012-07-13T11:46:34.300 に答える
0

VS2012 デバッガーは、未処理の例外を超えて続行しません。

于 2013-12-11T17:14:41.970 に答える
-1

デフォルトでは、デバッガーは、キャッチされていない (つまり、未処理の) すべての例外で停止します。これは、[例外] ダイアログで変更できます (CTRL+ALT+E、私のキーバインディングを使用)。

于 2012-07-13T11:47:51.830 に答える