1

短いバージョン:コードの特定のセクションでスローされた ものをすべてキャッチしjava.lang.Errorてログに記録し、まったくキャッチしなかったかのようにコールスタックを伝播できるようにするにはどうすればよいですか?

ロングバージョン...

java.lang.Errorコードのセクションで、それらをログに記録するためにすべてをキャッチしたいと思います。しかし、私はまたError、コールスタックを上っていくように継続させたいので、動作はまったくキャッチしなかった場合と同じになります。

さらに、すべてをキャッチしてログに記録しjava.lang.Exception、それらにもコールスタックを伝播させたいと思います。

私はこれを試しました...

    } catch (Throwable e) {
        e.printStackTrace();
        throw e;
    } 

...しかし、それに関する問題は、スローするために呼び出しスタックの上位にあるすべてのメソッドを変更する必要がThrowableあり、それらのメソッドの一部は変更するためのものではありません(私のメソッドはサードパーティフレームワークのメソッドによって呼び出されます)。

何か別のものを入れて投げるという、ある種のラッピングテクニックには満足しますが、まったく捕まえなかったかのように、自然な形で上向きに伝播Throwableさせたいと思います。java.lang.Error

提案?

編集: 「なぜ私はこれをしたいのですか?」と尋ねられました。これは私が明確にする良い質問だと思います。これは私の会社で使用するためのフレームワークです。システム管理者が含めるのを忘れている可能性があるのは、jarに含まれている他のフレームワークに依存します。その場合、コードの特定の場所にNoClassDefFoundErrorがあります。ただし、ブラウザにこのエラーが表示されるのはユーザーのみであり、サーバーログには表示されません。システム管理者がこのエラーに対処するための指示を持っているので、このエラーが発生したことをシステム管理者が知ることができるように、ログに記録したいと思います。

4

1 に答える 1

6

あなたは言った:「私はこれを試しました...」

    } catch (Throwable e) {
        e.printStackTrace();
        throw e;
    } 

代わりに試してください:

    } catch (Error e) {
        e.printStackTrace();
        throw e;
    } 

エラーはチェック例外ではありません。メソッド シグネチャで宣言する必要はありません。それを最も外側のメソッドに入れるだけで、必要なことを実行できます。

編集:

Exception もキャッチして再スローしたい場合は、それについて考えてみましょう。Throwable には、Error、Exception、RuntimeException の 3 種類があります。Error と RuntimeException はチェックされませんが、RuntimeException ではない Exception はチェックされます。

したがって、RuntimeException に対しても、Error に対して行うのと同じことができます。

    } catch (RuntimeException e) {
        e.printStackTrace();
        throw e;
    } catch (Error e) {
        e.printStackTrace();
        throw e;
    } 

そして、RuntimeException ではない Exception はどうですか? 理解しておくべきことは、これらはチェック例外であり、コードが呼び出しているメソッドで宣言されていない場合、それらはスローされないということです。したがって、それらをキャッチ/再スローする必要はありません。呼び出されたメソッドの一部が実際にそのような例外をスローする場合は、それをキャッチ/再スローし、メソッドがその例外をスローしていることをマークする必要がありますが、それらは外側のメソッドが呼び出しているメソッドから来ているため、とにかくそれを行う必要があります。

于 2013-03-03T20:04:19.743 に答える