5

重複の可能性:
最後にブロックが実行されていませんか?

最後にc#でブロックすることについて質問があります。私は小さなサンプルコードを書きました:

public class MyType
{
    public void foo()
    {
        try
        {
            Console.WriteLine("Throw NullReferenceException?");
            string s = Console.ReadLine();
            if (s == "Y")
                throw new NullReferenceException();
            else
                throw new ArgumentException();          
        }
        catch (NullReferenceException)
        {
            Console.WriteLine("NullReferenceException was caught!");
        }
        finally
        {
            Console.WriteLine("finally block");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyType t = new MyType();
        t.foo();
    }
}

私の知る限り、例外がスローされたかどうかに関係なく、最終的にブロックは決定論的に実行されると想定しています。ここで、ユーザーが「Y」を入力すると、NullReferenceExceptionがスローされ、実行はキャッチクロックに移動し、次に、予想どおりにfinallyブロックに移動します。ただし、入力が別のものである場合は、ArgumentExceptionがスローされます。この例外をキャッチするのに適したcatchブロックがないため、実行によってfinallyブロックを移動する必要があると思いましたが、そうではありません。誰かが私に理由を説明してもらえますか?

みんな、ありがとう :)

4

2 に答える 2

6

デバッガーはおそらくArgumentExceptionをキャッチしているため、最後のブロックに入る前に、デバッガーがそれを「処理」するのを待っています。アタッチされたデバッガーなしで(JITデバッガーなしで)コードを実行すると、finallyブロックにヒットするはずです。

JITを無効にするには、[オプション]>[ツール]>[デバッグ]>[ジャストインタイム]に移動し、[管理]のチェックを外します

デバッガーを接続せずにデバッグするには、VisualStudioで[デバッグ]>[デバッグなしで開始](またはCTRL + F5)に移動します。

また、プログラムの最後にConsole.ReadLine()を配置して、finallyブロックに入った後にコンソールが閉じないようにすることも役立ちます。

class Program {
    static void Main(string[] args) {
        MyType t = new MyType();
        t.foo();
        Console.ReadLine();
    }
}

取得する必要のある出力は次のとおりです。


NullReferenceExceptionをスローしますか?N

未処理の例外:System.ArgumentException:値が予期された範囲内にありません。

P:\ Documents \ Sandbox \ Console \ Console \ Console \ Program.cs:line 17のConsoleSandbox.MyType.foo()にあります

ConsoleSandbox.Program.Main(String [] args)のP:\ Documents \ Sandbox \ Console \ Console \ Console \ Program.cs:line 31

最後にブロック

何かキーを押すと続行します 。。。

于 2011-02-01T08:41:14.963 に答える
1

表示されるのは、テストプログラムの成果物です。

メインの方法を変更した場合:

 static void Main(string[] args)
 {
    try
    {
        MyType t = new MyType();
        t.foo();
    }
    catch
    {
       // write something
    }
 }

その後、foo()期待どおりに動作します。

そのトップレベルのtry/catchがないと、プログラム全体が中止されていました。

于 2011-02-01T08:52:37.090 に答える