A、B、C という 3 つのクラスがあり、すべての例外がクラス A に集中し、A が親クラス、B が A の子クラス、C が B の子クラスの場合、クラス C でアプリケーション定義の例外が発生した場合次に、その例外をクラス B にスローし、クラス B がクラス A にスローして例外を集中化します。実際にクラス C によってスローされるクラス A で例外トレースを取得するにはどうすればよいでしょうか。
3 に答える
まず第一に、現在の作業単位を中止してエラーをログに記録するだけでなく、実際に例外について別のことを行う場合を除いて、可能であればチェック例外を避けるようにしてください。
第 2 に、チェック済みの例外をコントロールの外部で発行するコードをラップする必要があります。
try {
...
} catch (RuntimeException e) { throw e; }
catch (Exception e) { throw new RuntimeException(e); }
それ以外の場合、チェックされた例外が含まれていない場合は、何もキャッチしないでください。例外は、集中処理場所に自動的に上向きに伝播します。
最後に、説明どおりにすると、元のスタック トレースが常に保持されます。つまり、キャッチされた例外に直接、または で取得できる例外に保存されます.getCause()
。printStackTrace()
aまたは aを実行するだけで、log.error("error", e)
原因チェーン全体が自動的に取得されます。
単純。親クラス A で例外を処理できるメソッドを定義します。
派生クラスでは、
public void method(){
try{
//code
}catch(Exception e){
super.catchExceptionMethod(e);
}
}
スタック トレースを取得して知ることができThrowable#getStackTrace()
、それぞれが 1 つのスタック フレームを表すスタック トレース要素の配列の形式でスタック トレースの情報を提供します。
これStackTraceElement
には、LineNumber、メソッド名、実行されたクラス名が含まれます。そのため、実際に投げられた場所を知ることができます。