7

次のコード スニペットがあるとします。

static void Main(string[] args)
{
    try
    {
        throw new Exception("Exception");
    }
    catch
    {
        throw;
    }
    finally
    {
        Console.WriteLine("------finally-----");
    }
}

未処理の例外とfinallyブロックがあります。

werfaultが有効Cancelになっていて、「問題を自動的に解決」しようとしているときに押すと、最終的にブロックが実行されます。

しかし、私が押していない場合Cancel、次のウィンドウでClose The Program finallyブロックをクリックしても実行されません。

そして最後に無効werfaultにしてクリックすると、Close Program 最終的にブロックが実行されます。

この状況を説明する c# 仕様のドキュメントは見つかりませんでした。また、私はこれを見つけましたMSDN

ハンドルされないエラーの後の finally ブロックの実行は、例外アンワインド操作がどのようにトリガーされるかによって異なります。

しかし、説明はありません。なぜこれが起こっているのか誰でも説明できますか?

更新 1 : .Net Framework 4.5.1 および 4.5.2 でテストしました。

4

3 に答える 3

1

WerFault.exe 未処理の例外が原因で .NETプロセスをすぐに終了WerFaultして強制終了しますが、 Microsoft .NET エラー報告を無効にすると、何らかの理由でアプリケーションが閉じられるため、ブロックは引き続き実行され、プロセスfinallyは終了しません。

プロセスがすぐにWerFault.exe終了することを確認する最良の方法は( ) です。Event ViewerDescription: The process was terminated due to an unhandled exception.

Application: ConsoleApplication3.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception
Stack:
   at ConsoleApplication3.Program.Main(System.String[])
于 2015-10-01T20:02:14.660 に答える
1

Werfault.exe (Windows エラー報告) は、Framework 4 以降を対象とするソフトウェアに対して呼び出されます。
あなたが言及するように動作します。
Dw20.exe (ワトソン博士) は、Framework 3.5 以下で呼び出されます。
正しく動作します (常に finally を呼び出します)。

これらの (非 .net) プログラムの動作は異なります。これは明らかにバグのある Werfault のミニダンプ (最後にプログラムを強制終了する) の生成方法に起因する可能性があります。

一部のユーザーがすでに気付いているように、WerFault は「欠陥のある」プログラムである可能性があります

とにかく、開発者にとって、「Console 9」アプリケーションに関するデータを Microsoft に送信することは関係ないと思います。したがって、エラー報告を安全に無効にすることができます:

HKLM/SOFTWARE/Microsoft/Windows/Windows エラー報告/無効を 1 に設定します。

結論として、プライバシーについて懸念がある場合は、NSA がデータを使用する可能性があるため、Werfault が Microsoft にデータを送信することはできません。

于 2015-10-02T04:29:32.860 に答える
-1

これを試して:

 static void Main(string[] args)
    {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        try
        {
            throw new Exception("Exception");
        }
        catch
        {
            throw;
        }
        finally
        {
            Console.WriteLine("------finally-----");
        }
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
    }

私はそれを見つけます:コンソールアプリケーションの.NETグローバル例外ハンドラー

于 2015-09-29T07:48:36.123 に答える