Throwable.printStackTrace(PrintStream s)
完全なスタックトレースを印刷して、最後の行を超えて見えるようにする方法はあり"... 40 more"
ますか?
Throwable.printStackTrace(PrintStream s)
完全なスタックトレースを印刷して、最後の行を超えて見えるようにする方法はあり"... 40 more"
ますか?
回答:
する必要はありません。その情報はスタックトレースの他の場所にあります。のドキュメントからprintStackTrace()
:
文字を含む行の存在に注意してください
"..."
。これらの行は、この例外のスタックトレースの残りの部分が、この例外(「囲んでいる」例外)によって引き起こされた例外のスタックトレースの下部から指定されたフレーム数と一致することを示しています。この短縮形は、「原因となる例外」がキャッチされたのと同じメソッドからラップされた例外がスローされる一般的なケースで、出力の長さを大幅に削減できます。
つまり、は"... x more"
チェーン例外にのみ表示されx
、スタックトレースの最後の行がすでに別のチェーン例外のスタックトレースの一部として存在している場合に限られます。
メソッドが例外Fooをキャッチし、それを例外Barにラップして、Barをスローするとします。その後、Fooのスタックトレースが短縮されます。なんらかの理由で完全なトレースが必要な場合は...
、Fooのスタックトレースの前の最後の行を取得して、Barのスタックトレースでそれを探すだけです。その行の下にあるものはすべて、Fooのスタックトレースに出力されたものとまったく同じです。
Throwable.printStackTrace()のドキュメントからスタックトレースを取得してみましょう。
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more
原因は、一番下にある最もネストされたもの(「根本原因」)から、印刷されたスタックトレースが属するものまで表示されます。
この場合、根本的な原因はLowLevelException
、それが原因MidLevelException
であり、それが原因HighLevelException
でした。
完全なスタックトレースを取得するには、囲んでいる例外(および囲んでいる例外)のフレームを調べる必要があります。
したがって、完全なスタックトレースを取得LowLevelException
するには、次のようにします。
MidLevelException
)
で省略されたフレームを探します。MidLevelException
(HighLevelException
)の囲み例外を見てください。完全なスタックトレースは次のようになります。
LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
// From MidLevelException stack trace
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
// From HighLevelException stack trace
at Junk.main(Junk.java:4)
サイドノート:
フレームがリストされていない場合があります。例:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
これは、原因が同じ行に作成された場合に発生する可能性がありますnew HighLevelException(new MidLevelException())
。これで混乱しないでください。上記のアプローチは引き続き機能します。例外から使用するフレームがないので、囲んでいるフレームを続行します。
場合によっては、省略されていない最初のフレーム(上記の行... X more
)を確認することで、カウントを節約できます。その行でメソッドを呼び出すメソッドがわかっている場合は、囲んでいる例外のフレームで呼び出し元を直接検索できます。
HighLevelException: MidLevelException: LowLevelException
at Junk.c(Junk.java:29)
at Junk.b(Junk.java:21)
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException
// You know Junk.d is only called by Junk.b
at Junk.d(Junk.java:35)
... 3 more
...
は異なる最初のフレームです。しかし、それはそれを見つけるのに役立つ少なくとも同じクラスになります。