1

もちろん、例外はあなたが考える適切なレベルで適切に処理する必要があります。チェックされた例外をどう処理すればよいかわからず、それを適切なカスタムのチェックされていない例外でラップして、最上位まで伝播するとします (そのラップされた例外やその他の可能性のあるチェックされていない例外を何らかの媒体で処理しないと想定されています)。元の例外が発生したレベルから離れてレベルアップします(方法を知りたくない、または知らないため))。さらに進んで、すべての未処理の例外 (未チェックおよびチェック済み、未チェックでラップされたもの) が最上位 (メイン メソッド、webapp のコントローラーなど) に達しました。もちろん、私は何かをする必要があります。私がやりたいことは、ログ エントリを使用して何かが間違っていることを開発者に通知し、ユーザーに彼の要求ができることを伝えることだけです。正しく処理されない (その例外に適切なメッセージに応じて異なるメッセージを使用する)。そのために、私はキャッチブロックで使用しますRuntimeException(カスタムのチェックされていない例外をキャッチした場合は、ユーザーに「重大な問題が発生しました」などのメッセージを送信します。そのようなカスタムのチェックされていない例外がキャッシュされる可能性はゼロより大きいため、それについて連絡する必要があります)。一部の記事 (最初2 番目) catch ブロックでスーパー タイプによってサブクラスのインスタンスをキャッチしないようにアドバイスします (または、チェック済みの例外にのみ関連していますか?)。catch ブロックで正確な種類の例外を使用すると、チェックされていない例外を見落とし、アプリケーションがクラッシュします (もちろん、ログを記録してユーザーに通知する catch ブロックには重複したコード スニペットが存在します)。例として、jsp 変換フェーズで構築され、スーパー タイプを使用してそのスーパータイプのサブクラスのインスタンスをキャッチするスニペットを提供できます。

// some code
try {
    // body of translated JSP here...
} catch (Exception e) {
    out.clear();
    pageContext.handlePageException(e);
}
// some code  

私の質問:この概念はRuntimeException、開発者にすべての問題を報告し、発生したすべての問題についてユーザーに伝えるために、最上位の catch ブロックで使用するのに正しいですか? もちろん、この場合の例外処理は、問題が発生したことを開発者とユーザーに通知するだけであり、回復戦略はありません。その概念を例外処理と呼ぶのは難しいかもしれません。私を修正してください。その概念についてのアイデアに感謝します。

4

2 に答える 2

-1

Exceptionすべての を でラップし、RuntimeExceptionそれらをmainメソッド内、またはトップレベルとして定義した場所で処理することは、非常に悪い習慣です。のインスタンスはException、回復可能なエラーを特定するために存在するため、スローされた場所のできるだけ近くで処理する必要があります。たとえば、ファイルを開こうとしてFileNotFoundException.

ほとんどの場合、RuntimeExceptionプログラミング エラーを表します ()。多くの場合、アプリケーションが不安定な状態にあり、回復が不可能ではないにしても困難であることを示しています。IllegalStateExceptionNullPointerExceptionおよびIndexOutOfBoundsExceptionそのような状況の例です。

さて、あなたが提案しているコンセプトは、すべてRuntimeExceptionの s がトップレベルのメソッドにキャッチされるというもので、数百行を超えるコードを含むソフトウェアにとって実行可能なソリューションではなく、短いプログラムでは非常に悪い習慣です。

10 万行のコードを含むアプリケーションがあるとします。例外がスローされると、最上位のメソッドから例外を正しく処理できなくなります。の場合はどうすればよいNullPointerExceptionですか?どこから投げられたの?そしてそれはどうCloneNotSupportedExceptionですか?これまでで最大のif-then-elseステートメントを使用して、考えられるすべての例外を処理する数十ページの長さのトップレベル メソッドを作成することになります。

catchさらに、このような概念を実装する場合は、例外がスローされるたびに、アプリケーションが最上位メソッドのそのブロックに移動することに注意する必要があります。エラーをログに記録すると、アプリケーションのエラーを生成した部分にコントロールを返すことはできなくなります。これは、Exceptionがスローされたコンテキストがないためです。

于 2013-10-08T14:42:20.007 に答える