6

(Java)プログラムに、前回実行したときにクラッシュしたことを認識させ、「このプログラムは前回クラッシュしたようです。この問題をここで報告してください: bla@foo.com . ...」

これを行うための推奨される方法はありますか? (悪い?)私が持っていたアイデアは次のとおりです。

  • プログラムが起動時に一時キー ファイルを保存し、定期的に閉じるときに削除します。起動時にファイルが存在する場合は、メッセージを表示します。
  • この場合、デッドロックを認識し、「エラー ファイル」を保存します。起動時に「エラー ファイル」が存在する場合は、エラー メッセージを表示し、ファイルをアーカイブなどに移動します。
4

6 に答える 6

7

Java プログラムがクラッシュする理由は 3 つあります。

  • 未処理の RuntimeException。try-catchこれはin で簡単に解決できmainます。
  • 未処理のエラー。これらはまれですが、捕まえることmainもできます。私は通常キャッチThrowablemainます。テンプレートについては、以下を参照してください。
  • スレッドを使用する場合は、 を参照してThread.setDefaultUncaughtExceptionHandler()ください。
  • VM のバグ、またはユーザーによって強制終了されたプログラム、またはハードウェアの暴力的なシャットダウン。これらは、キャッチできないクラッシュにつながります。ここで、最適なオプションは、フラグ ファイルをどこかに作成することですnew File(...).deleteOnExit()。機会があれば、Java がクリーンアップしてくれます。

デッドロックの問題は、デッドロックを検出する方法です。私はまだそれを行う一貫した方法を見たことがありません。

import org.apache.commons.lang.exception.ExceptionUtils;

public class Demo
{
    public static void main (String[] args)
    {
        try
        {
            Demo obj = new Demo ();
            obj.run (args);
            System.out.println ("Done.");
        }
        catch (Throwable t)
        {
            ExceptionUtils.printRootCauseStackTrace (t);
        }
    }
}
于 2009-11-17T13:26:33.227 に答える
3

キャッチされていない例外のようにクラッシュしますか?Thread.setDefaultUncaughtExceptionHandlerを使用して、クラッシュの一部としてメッセージを表示します。

最初のアイデアでは、同時に実行されているアプリケーションの複数のインスタンスをどのように処理しますか?(マルチユーザー環境についても考えてください)。

デッドロックを認識する-デッドロックが問題になる頻度はどれくらいですか?すべての「キー」スレッドのスレッド状態を監視できると思います。

次に、アプリケーションを強制終了する外力があります。それらを報告する必要のある問題と見なす必要がありますか?結局のところ、この場合、アプリケーションに問題はありませんでした。

最後に、常に「エラーファイル」をログの形式で保存します。適切なロギングフレームワーク(つまり、Java LoggingまたはLog4J)を使用します。この最後の行で、アプリケーションが正常に終了したことを示すシグナルを確認できますが、マルチインスタンス環境では注意が必要です。

于 2009-11-17T13:23:33.420 に答える
2

あなたが提案する最初の解決策の変形は、プロセスの Un*x で十分に一般的です。起動時に、実行中のプロセスの pid ファイルをファイルに保存します。プログラムを再度起動すると、このファイルがまだ存在するかどうかを確認できます (この pid を持つプロセスが実行されている場合でも)。

Java では、ThreadMXBean で定義された Threadid を使用して、おそらくこの考え方を適応させることができます。しかし、どのファイルでも構いません。あなたが提案するキーを含むファイルは、十分な方法のようです。また、最後の実行時間などの有用な情報を入れることもできます。起動時にまだ存在する場合、プログラムは正常に停止しませんでした。

また、起動やクリーン ストップ、ロックなどのプログラム イベントをトレースする起動ログ ファイルのようなものになる可能性もあります。

于 2009-11-17T13:27:49.293 に答える
0

私がしていることは、System.errをファイルにリダイレクトして、エラーメッセージ(クラッシュなど)が後で処理できるファイルになってしまうようにすることです...

これを行うためのコードは非常に単純です...

String errLog = "c:\\myLog";
try 
{
  java.io.PrintStream err = new java.io.PrintStream(new java.io.FileOutputStream(errLog));
  System.setErr(err);
}
catch (java.io.FileNotFoundException fnfe) {}
于 2009-11-17T13:25:57.237 に答える
0

これらの回答の多くは、アプリの動作を停止する原因となった例外の追跡に関するものです。

もう1つの可能性は、アプリケーションが終了したことです(つまり、ユーザーがアプリケーションを強制終了した、コンピューターがシャットダウンした、停電など)。あなたの一時的な重要なアイデアはそれでうまくいくと思います。これは、viやWordなどのテキスト編集プログラムが編集中のファイルの特別なコピーを自動的に作成する方法に似ています。開くと、特別なコピーが存在するかどうかを確認し、ファイルを回復するかどうかを尋ねます。

于 2009-11-17T16:51:18.197 に答える
0

ここでマルコスの真似をします。プログラムの最後のエラー メッセージと最後の実行日をホストする構成ファイルまたはログ ファイルを作成します。次に、プログラムのロード中にそのファイルを読み取ります。

于 2009-11-17T13:27:36.970 に答える