6

次のようなメソッドチェーンがある場合:

        var abc = new ABC();
        abc.method1()
           .method2()
           .methodThrowsException()
           .method3()
           ;

私が定義したと仮定してmethod1()method2()method3()

    public ABC method1() {
        return this;
    }

methodThrowsException()として

    public ABC method3() {
        throw new ArgumentException();
    }

コードを実行するときに、どの特定のコード行が例外をスローしたかを知ることは可能ですか、それともすべてのメソッドチェーンを1行と見なすだけですか?私は簡単なテストを行いましたが、それらはすべて1行と見なされているようですが、MethodChaining

メソッドを別々の行に配置すると、エラーメッセージとデバッガーの制御が通常は行ごとに行われるため、デバッグも容易になります。

私は何かが足りないのですか、それともC#には当てはまりませんか?

ありがとう

編集: これが私が現在得ているものです:

代替テキストhttp://img163.imageshack.us/img163/4503/83077881.png

4

4 に答える 4

6

例外の詳細の一部として表示されるスタックトレースを見ると、コードのフォーマットに関係なく、例外の正確な場所がわかります。

デバッガーで特定の行にブレークポイントを設定できる場合は、コードのフォーマットを変えると便利だと思いますが、C#では、ブレークポイントは個々の式に配置されるため、これはあまり役に立ちません。ブレークポイントを配置できるようにするには、おそらく次のようにコードを書き直す必要があります。

var abc = new ABC(); 
var abc1 = abc.method1();
var abc2 = abc1.method2();
// etc...

同じことが(スクリーンショットの)現在の式の強調表示にも当てはまります。ただし、例外に関する正確な情報は、スタックトレースで常に利用できます。

于 2010-05-21T15:13:59.267 に答える
1

VisualStudioデバッガー(Monoにはデバッガーがないため、MonoではなくVSを使用していると想定します)は、コードが実行している実際の行を認識しており、ほとんどのCのように、すべてのステートメントを最も近いセミコロンにロールアップしません。 /C++デバッガーはそうする傾向があります。同様に、すべてのステートメントを同じ行に配置した場合でも、VSは、実行中のメソッドと例外をスローしたメソッドを表示できます。

編集:実際に例外がスローされていますか?次に、例外スタックトレースを確認します。

于 2010-05-21T15:06:48.000 に答える
1

サンプルコードを実行すると、スタックトレースで報告された行は、実際には例外がスローされた行であり、メソッド呼び出しの行ではないことがわかります。VSデバッガーも、メソッド呼び出しではなく、この行で停止します。

更新:スクリーンショットの左側にある緑色のエラーは、コールスタックの最上位にいないことを示しています。[コールスタック]ウィンドウを開き(たとえば、[デバッグ]->[ウィンドウ]->[CAllスタック]メニューを使用)、最初の行をダブルクリックして、例外が実際にスローされる場所に移動します。呼び出しスタックの最初のメソッドもですmethod3()

Martin Fowlerからの引用は一般的なデバッグに言及しているため、Java IDEまたはその他の統合デバッガーには当てはまる可能性がありますが、VisualStudioIDEには当てはまらないことに注意してください。それでも、例外のスタックトレースを確認することで、問題の原因となったメソッドを簡単に特定できます。

于 2010-05-21T15:13:15.540 に答える
1

例外が生成された正確なコード行を確認できますが、例外をスローするメソッドを呼び出したコード行は2になります(以下の番号付けを参照)。

         try {

Line 1        var abc = new ABC();
Line 2        abc.method1()
Line 3           .method2()
Line 4           .methodThrowsException()
Line 5           .method3();
Line 6  catch(Exception e)
        {
            StackTrace t = new StackTrace(e, true);
        }

スタックトレース(例外スタックトレースで、またはStackTraceオブジェクトを作成することで確認できます)には、次の2つのフレームが含まれます。

  • 最初は、例外をスローするメソッドが定義されている行とファイルにあります

  • 2番目は2行目になります

于 2010-05-21T15:20:18.417 に答える