2016-07-02 4 views
0

コードが実行されるまでポイントを追跡する必要があります。私は1つの方法は、例外自体に変数を作成し、この使用の例外、すなわちを行う、または関数を参照することによって何かを渡すことです、例外が発生したどの時点で識別するためのメカニズムが必要ですコードが実行されるまでのポイントの追跡

function f() throws Exception{ 
    statement 1 //can throw exception 
    statement 2 //can throw exception 
    statement 3 //can throw exception 
} 

:下記のプログラムを考えてみましょうfを使用して、関数がどの時点で正常に実行されたかを識別します。

どちらが良い方法ですか、これを行うにはもっとエレガントな方法がありますか?

+0

これらの例外やAPIを使用していますか? – Andrew

+0

私はそのレベルでいくつかの上位レベルで例外をキャッチします。特定のアクションを実行できるように、コードがあるポイントで実行された場合の方法を理解する必要があります。 –

+0

あなたは 'f'を手にしていますか?あなたはそれを変更できますか?もしそうなら、各ステートメントの周りの "try catch"は、カスタムステートメントでスローされた例外をラップし、後でカスタムハンドルを処理するのに役立ちます。いくつかのアスペクトはおそらく別の解決策です –

答えて

5

よくある間違いは、スタックトレースをプリントアウトしないか、または例外をまったく印刷しないことです。あなたが有用な情報を捨てているので、ほとんどの場合、そうしないでください。

デバッガを使用してコードをステップ実行するか、例外がスローされた正確なポイントを見つけるか、例外のスタックトレースを読み取ることができます。スタックトレースは、それがライン101、102または103上の例外をスローしたと言う

public static void f() throws Exception { 
    statement1(); //can throw exception line 101 
    statement2(); //can throw exception line 102 
    statement3(); //can throw exception line 103 
} 

が、これは、それが実行されたステートメントを示します。

実行時にこれを行う必要がある場合は、それぞれをtry/catchブロックに入れるたびに異なる処理を行う必要があります。

public static void f() throws Exception { 
    try { 
     statement1(); 
    } catch (TheException e) { 
     doSomething1(); 
     // return or throw 
    } 
    try { 
     statement2(); 
    } catch (TheException e) { 
     doSomething2(); 
     // return or throw 
    } 
    try { 
     statement3(); 
    } catch (TheException e) { 
     doSomething3(); 
     // return or throw 
    } 
} 
+0

私は実行時にそれを必要とする、私は解決策が動作しないと思います。 –

+3

スタックトレースを読み取る@AkashdeepSalujaは実行時にも実行できますが、行番号の意味を知る必要があります。より良いアプローチは、異なる動作を期待するときはいつも異なる例外を使用するか、各ステートメントをそれ自身のtry/catchブロックに配置することです。 –

+0

@AkashdeepSaluja複数のtry/catchブロックを使用する例を追加しました。 –

2

私は少しトリックをしたいと思いますが、それが正しいかどうかはわかりません。あなたは

} catch (Exception e) { 
    e.initCause(new ExceptionLevel(1)); // from the first statement 
    throw new AnyException("message", e); 
} 

int statement = e.getCause() == null ? 0 : ((ExceptionLevel)e.getCause()).getValue(); 
(グローバル catchブロックの内部で)このすべてを処理するために必要があるその後

public class ExceptionLevel extends Throwable { 
    private int value; 

    public ExceptionLevel (int v) { value = v; } 
} 

、あなたが例外をスローするとき(それがThrowable(Throwable cause)コンストラクタを持っている必要があります)、

私の主な考えを理解していると思います。あなたはchain of exceptionsの最後の原因としてExceptionLevelを作って少し改善するかもしれません。

+0

これはおそらく解決策ですが、元の例外は失われてしまい、それは悪いです –

+1

例外クラスをたくさん必要としない場合は、別の動作に別の例外を使用するか、テキスト 'message'を使用します。 –

+0

@RC。、私たちは原因の連鎖を構築することができます、緩むことはありません – Andrew

関連する問題