6

プログラムが実行されている限り、finallyブロックは常に実行されると私は想定していました。ただし、このコンソールアプリでは、finallyブロックが実行されていないようです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new Exception();
            }
            finally
            {
                Console.WriteLine("finally");
            }
        }
    }
}

出力

結果

注:例外がスローされたとき、ウィンドウからアプリケーションを終了するかどうか尋ねられたので、「はい」と答えました。

4

5 に答える 5

6

実際に実行しました。気づかなかっただけです。Windows is checking for a solution to the problemクリックして見るとすぐにCancel

ここに画像の説明を入力してください

于 2013-01-10T16:38:09.837 に答える
2

デバッグしている可能性があり、[いいえ]をクリックすると、デバッガーによって実行が停止されます。

于 2013-01-10T16:38:32.277 に答える
2

「ConsoleApplication1」が応答を停止した場合、2つの選択肢があります。

Windowsエラー報告ダイアログ

キャンセルを押すと、未処理の例外は、最終的にアプリケーションが終了するまで続行できます。これにより、finallyブロックを実行できます。キャンセルを押さない場合、Windowsエラー報告はプロセスを停止し、ミニダンプを収集してからアプリケーションを終了します。これは、finallyブロックが実行されないことを意味します。

または、より高いメソッドで例外を処理すると、finallyブロックが確実に表示されます。例えば:

static void unhandled()
{
    try
    {
        throw new Exception();
    }
    finally
    {
        Console.WriteLine("finally");
    }
}

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
    try
    {
        unhandled();
    }
    catch ( Exception )
    {
        // squash it
    }
}

常に「最終的に」出力を提供します

于 2013-01-10T17:24:01.673 に答える
1

コマンドラインから実行する場合。Windowsがアプリケーションを正常に終了しようとしたとき、noまたはcancelアプリケーションが応答しない場合。 ここに画像の説明を入力してください

于 2013-01-10T16:39:30.513 に答える
-2

例外は、ハンドラーが見つかるまでスタックをバブルアップします。そうでない場合、プログラムは終了します。これはあなたのシナリオの場合です...ハンドラーがないので、プログラムはfinallyブロックに到達する前に終了します。

于 2013-01-10T16:40:07.383 に答える