質問

私は現在、Windows、Linux、MacOS X でうまく動作する Java のクロスプラットフォーム アプリケーションに取り組んでいます。私は「クラッシュ」の検出(および処理)を行うための良い方法を考え出そうとしています。Java での「クラッシュ」を検出し、それに応じて何かを行う簡単なクロスプラットフォームの方法はありますか?

「クラッシュ」とは、キャッチされなかった例外を意味すると思います。ただし、コードでは一部の JNI が使用されているため、不正な JNI コードによるクラッシュを検出できれば良いのですが、これは JVM 特有のような気がします。

役に立ちましたか?

解決

単純なキャッチオール処理のために、次の静的メソッドを使用できます。 . 。Javadoc から:

静的ボイド setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler えっ)
例外がキャッチされずにスレッドが突然終了し、そのスレッドに他のハンドラーが定義されていない場合に呼び出されるデフォルトのハンドラーを設定します。

これは、他では捕捉できない可能性のあるエラーや未チェックの例外を処理するための非常に広範な方法です。

サイドノート: コードが問題の原因に近いところで例外をキャッチ、記録、および/または回復できれば、より良いことになります。私は、この種の一般化されたクラッシュ処理は、完全に回復不可能な状況(つまり、のサブクラス java.lang.エラー)。の可能性を避けるようにしてください。 ランタイム例外 ソフトウェアがそれを生き延びることは可能であり、それが望ましいかもしれないため、完全に捕らえられることはありません。

他のヒント

キャッチされなかった例外を処理するために、ThreadGroup.uncaughtException(...) の実装を提供する新しい ThreadGroup を提供できます。その後、キャッチされなかった例外をキャッチし、それらを適切に処理できます (例:クラッシュログをホームに送信します)。

JNI の面では私はあなたを助けることができません。JVM を呼び出す前にネイティブ ラッパー実行可能ファイルを使用する方法はおそらくありますが、その実行可能ファイルは、呼び出す可能性のあるすべての JVM と、指示がどのようにクラッシュし、どこでクラッシュするかを知る必要があります。クラッシュログなどが置かれます。

これが必要かどうかはわかりませんが、ネイティブ コード内から例外が発生したかどうかを検出することもできます。見る http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 詳細については。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top