2

私は大規模なアプリケーションに取り組んでいます。私はすべての例外を注意深く処理しようとします(そして可能であれば事前にそれらを防ぎます)。ただし、アプリケーションは大規模であるため、いくつかの例外がスローされることがあります。開発環境で作業しているとき(つまり、Eclipseからアプリケーションを起動しているとき)、アプリケーションが発生した場所を確認し、そこに移動して、それに対して何ができるかを確認できます。問題は、開発中、他の人がすでにアプリケーションを(社内で)「一種のテスト作業」をしていることです。彼らは私にたくさんのフィードバックをくれます、それは私が好きです。アプリケーションで例外がスローされた場合、この例外がどこで作成されたかを知る方法はありません。

ダイアログを介してユーザーにキャッチされていない例外を表示するアプリケーションを見てきました。私は確かにこれが顧客バージョンで発生することを望んでいませんが、デバッグバージョンでそれを実行できれば非常に役立つかもしれません。これは可能ですか?

つまり、マルチスレッドJavaアプリケーションのスローされた例外とキャッチされていない例外をすべてキャッチすることは可能ですか?

編集:コードがどのように実行されるかを尋ねられました。すべてのライブラリとクラスファイルを含む実行可能なjarをEclipseで作成します。次に、 Launch4jを使用してこのjarを実行可能ファイルにパックします。次に、この実行可能ファイルを使用してアプリケーションを実行します( Innosetupを使用してリソースファイルと一緒にsetup.exeにパックされますが、これはそれほど重要ではないと思います)。

コード的には、必要なすべてのクラス(GUIを含む)を開始するThreadManagerがありますが、これらすべてのクラスへのハンドルを必ずしも保持しているわけではありません。

4

3 に答える 3

3

Thread.setDefaultUncaughtExceptionHandler()キャッチされていないすべてを処理するために使用しExceptionsます。

これを見る

于 2012-06-15T09:13:20.910 に答える
0

すべての例外が書き込まれるログが必要です。さらに、log4jを使用している場合は、エラーがログに記録された場合に電子メールを送信するorg.apache.log4j.net.SMTPAppenderを使用できます。このようにして、アプリケーションで例外が発生するたびに電子メールを受け取ります。

于 2012-06-15T09:19:02.243 に答える
0

したがって、各スレッドは、死ぬ前にすべてのThrowable(例外だけでなく)をキャッチし、それらをログにダンプする必要があります。

キャッチは2つの方法で行うことができます:

a)run()をオーバーライドする

try {
   super.run()
 } catch(Throwable ex) {
   ex.printStackTrace(logWriter);
 }

b)使用Thread.setDefaultUncaughtExceptionHandler()

ThreadManagerを使用する場合は、何らかの方法で例外をログに記録するスレッドを作成する独自のThreadFactoryを作成します。

于 2012-06-15T10:57:18.923 に答える