2017-01-16 4 views
0

Stacktrace Inerpreterを開発していますので、すべてのe.printStackTrace()呼び出しをprintTrace()にリダイレクトする方法はありますか?PrintStackTraceを自分自身の関数にリダイレクト

+2

'System.err'をあなたが選択した' PrintStream'で置き換えることができます。しかし、それは 'System.err'に送られたすべてのものを取得します。 –

+0

'try-catch'ブロックを意味しますか? 'e.printStackTrace()'が何をするのかを変更することを意味しますか? – ItamarG3

+0

開始する前に、ドキュメントを処理する例外を調べることをお勧めします(http://stackoverflow.com/documentation/java/89/exceptions-and-exception-handling#t=20170116170539288246) –

答えて

0

すべての例外に対して、e.printStackTrace()の処理を置き換えることはできません。それは、サブクラスでオーバーライドすることができることを意味、非最終的だが、デフォルトの実装は単純です:

printStackTrace(System.err); 

ですから、System.errがあるにフックすることを望むことができる唯一のこと。

System.errを自分で選択したPrintStreamに置き換えることができます。

System.setErr(somePrintStream); 

しかし、それはSystem.errに送らすべてを取得します。すべてを扱うか、スタックトレース(some ideas are here)だけを抽出する必要があります。

e.printStackTrace()の呼び出しをすべてあなたのメソッドの呼び出しで置き換えるほうが良いかもしれません(どちらにしても疑わしい値です)。

私はあなたがこれを行うことを提案するのが最善の方法を知りません。たとえば、の呼び出しをGoogle's errorproneのようなコンパイラツールで禁止することができます。

errorproneの調査結果に基づいて、置き換えを行うツールを見つけることもできます。

+0

これは良い答えですが、私はそれが正確に質問に答えるのではなく、むしろ可能なアプローチ(OPが話しているものとは異なる)を教えていると感じています。個人的に、私はあなたの2番目の提案は、この答えをはるかに良くするいくつかの細部を使用することができると思う(再び、これは私がそれを見ている方法です...) – ItamarG3

0

これは楽しい、いいですが、プロフェッショナルのためのものであれば、基本的にはSentryのようなものを再生産しているので、既製のツールを購入する方がよいでしょう。

Andy Turnerは、printStackTrace()を置き換えることができますが、非常に乱雑で信頼性の高いものではありません。 JavascriptやPythonのような言語は非常に簡単ですが、Javaでは、オブジェクト指向プログラミングの哲学に反しています(古い実装のJavaの制限があります)。しかし、方法を置き換えることができるPowermockというツールがあります。それを見せたいかもしれない。

私はSentryに言及したことを覚えていますか?これは、ロギングフレームワークを介して行います。とにかく、人々は通常slf4jのようなものに適切なロギングを行うために移行します。スタックトレースを印刷するのではなく、LOGGER.warn("Error communicating with client {}", ipAddr, e);を実行します。ロガーの反対側には、異なるレベル(エラー、警告、情報、デバッグ、トレース)と異なるクラスを実際に記録するように設定されたアペンダーがあります。 Sentryがこれを行う方法はアペンダーを付けることです。あなたが同じことをした場合、あなたはちょうどeを取得するフックを持っていたでしょう。

最後に1つ:いずれにしても、uncaughtExceptionHandlerを調べるとよいでしょう。あなたがすべての投げ札を捕まえていない限り、面白いものを見逃して、決してそれを記録しないかもしれません。

関連する問題