1

次のようなコードがあります。

try{
    func1();
}
catch(Exception e){
    /Do something
}


static func1(){
    func2();
}

static func2(){
    //Exception thrown here
    System.IO.StreamReader file = new System.IO.StreamReader(filePath);
}

func2()のコード行によって例外がスローされた場合、catch句で通知を受け取りません。私は明示的に何もスローしません。静的な通常の関数宣言があるだけです。「スロー」はどこにも表示されません。

例外がcatchステートメントに上向きに伝播しないのはなぜですか?

4

2 に答える 2

6

いいえ、コードは問題ありません。実際のコードには、表示されていないものがあります。その例外は正常に伝播します。

using System;

static class Program {
    static void Main() {
        try{
            func1();
        } catch(Exception e) {
            // works fine: FileNotFoundException
            Console.WriteLine(e);
        }
    }
    static void func1(){
        func2();
    }    
    static void func2() {
        string filePath = "doesnot.exist";
        System.IO.StreamReader file = new System.IO.StreamReader(filePath);
    }
}

候補者:

  • aを含むものtryはすべて疑わしいです-高音域で確認してください
  • スレッド化を伴うものは、どこか別の場所で例外が発生する可能性があります
于 2012-06-06T09:27:01.317 に答える
1

例外は、アプリがキャッチされるかクラッシュするまで「バブルアップ」します。

最善の策は、デバッガーを使用することです。HANDLED例外で停止するように設定されていることを確認してください(デバッグ/例外/共通言語ランタイム例外の[スロー]ボックスをオンにします)。

次に、コードを実行します。func2が例外をスローした場合、コードは壊れます。取り扱われるかどうかに関係なく。コードをステップスルーして、何がコードを処理しているかを確認できます。

于 2012-06-06T09:30:04.217 に答える