問題がある場合にDOSエラーレベルをゼロ以外の値に設定する必要があるシングルスレッドアプリがあります。RuntimeExceptionをスローするか、System.exit(nonzero)を使用する方が良いですか?スタックトレースは必要ありません。また、このアプリが拡張/再利用されることは期待していません。これら2つのオプションの違いは何ですか?
7 に答える
本当に例外的な条件がない限り、例外をスローしないでください。System.exit(int)
まさにこの理由でそこにあります。これを使って。
編集:私はあなたの質問を読み間違えたかもしれないと思います。JVMを正常に終了したいが、例外をスローするか、を使用する方がよいかどうか、何かがうまくいかなかったことを通知する場合、あなたは尋ねていると思いましたSystem.exit
。
ただし、発生する問題がJava例外によってすでに示されている問題である場合は、その例外を処理せずにそのままにしておくことは問題ありません。例外をキャッチしてを呼び出す必要はありませんSystem.exit
。
独自の例外をスローするか呼び出すかを選択できる場合はSystem.exit
、エラー状態が、メソッドを呼び出すJavaコードによって処理される可能性があるものであるかどうかを検討してください。エラーがmain
メソッドで直接発生した場合、例外を処理する呼び出し元はおそらく存在しないため、おそらくを呼び出す必要がありますSystem.exit
。それ以外の場合は、通常、例外をスローするのが最善ですが、そうではありませんRuntimeException
。発生したエラーを適切に表す例外タイプを使用する必要があります。必要に応じて、独自のサブクラスを作成しますRuntimeException
。
通常、この状況では、おそらくを呼び出すことによって、メインメソッドのすべての例外を処理しますSystem.exit
。これにより、エラーコードで終了する必要性を満たしながら、例外的な状態をどこで/どのように/どのように処理するかについて柔軟性が得られます。特に、リターンコードや、ユーザーに対して生成する可能性のあるその他の出力(エラーメッセージ、スタックトレースなど)を制御できます。mainで例外をスローする(または例外をエスケープする)と、その制御が失われます。
要約するとSystem.exit
、最上位の例外ハンドラーでのみ呼び出します。
static public void main() {
try {
runMyApp();
} catch (Exception e) {
System.exit(1);
}
}
スローされた例外はスタックトレースを出力します。それが必要ない場合は、System.exitを使用する必要があります。
終了時に、Sytem.outでユーザーに通知できます(アプリはコンマライン環境でのみ実行されていると思います)。
すべてのエラーをキャッチし、エラーを別のログに記録することを検討する必要があります。これにより、ターミナルを閉じたときにスタックトレースが永久に失われることはありません。この目的のためにlog4jを見てください、それは本当に使いやすいです。
APP自体はSystem.exitを使用する必要があります。これは、呼び出し環境(スクリプト)とのインターフェースです。もちろん、すべての内部コンポーネントは例外を使用する必要があります。あなたがそれをまとめるとき、それはそれらの両方である可能性があります:
Application.main(...) {
parse(args);
check(...);
try {
MyObject o = ...;
o.doMyStuff();
} catch (Exception e) {
System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld
System.exit(ERROR_CODE);
}
System.out.println("Worked!");
}
プログラムを開始するスクリプトに報告する情報の量によって異なります。スクリプトが一連のアクションを実行するように設計されている場合、これは非常に重要になる可能性があります。https://shapeshed.com/unix-exit-codes/
例:外部APIを呼び出し、応答をダウンロードしてファイルに保存するJavaプログラムを開発しました。考えられる結果:
- 0 = OK
- 5=HTTP一時的に利用できません
- 6=ファイルをディスクに書き込めません
これで、私のスクリプトは何がうまくいかなかったかを認識し、結果に基づいてさまざまなアクションを実行できます。
- 応答=0の場合、スクリプトの次のステップに進みます
- 応答=5の場合、再試行します(遅延して)
- 応答=6の場合、スクリプトを停止します
結論:他の優れたAPIと同様に、入力パラメーターと出力パラメーターを明確に定義し、を使用しますSystem.exit
。
System.exit(num)は、シャットダウンJVMであるため、適切なオプションではありません。さらに、after catchブロックがある場合は、finallyブロックを実行しませんでした。
RuntimeExceptionをスローすることも、最適なオプションではない可能性があります。前述のようにサブクラス化できます。これは、アプリ固有の例外であり、私の意見ではより適切なオプションである可能性があります。-マニッシュ
System.exit()は推奨されません。JVMをシャットダウンします。