2

フレームワークを使用して Web アプリケーションを作成していますSpring 3。N 個のコントローラーがある状況を考えてみましょう。各コントローラーは、リクエストを公開されたサービスに委任し、レスポンスを取得してユーザーに返します。

コントローラーコードからスローされた予期しないランタイム例外をキャッチするより良い方法があるかどうかを知りたいです。コントローラーメソッドごとに次のようなものを書きたくありません。それともそれが唯一の方法ですか?

try {
     //call the service
} catch(ServiceException serviceEx) {
    //do process for know exception  
} catch(Exception ex) {
    //return generic error message.
}

Spring Exception リゾルバーを使用できることはわかっています。しかし、予期しないエラーが発生したときに別のエラー ページを表示したくありません。ウィジェットの一部として UI に一般的なエラー メッセージを表示したいですか?

編集:

また、一部の操作を実行しようとするときに、ユーザーに例外スタック トレースが表示されないようにします。

サンダー

4

4 に答える 4

3

RuntimeExceptionsを捕まえるのは悪い習慣だと思います。もともとRuntimeExceptionは、プログラミングエラーの指標と考えられていた場所です(たとえば、チェックが欠落NullPointerExceptionしていることを示すため)。null一方、チェックされた例外は、プログラムが回復できるエラーを示すことを意味します(例FileNotFoundException)。

今日の問題は、多くのフレームワークがRuntimeException、チェックされた例外を使用する必要がある場所でを使用することです。したがって、プログラムが例外を処理できる場合と、プログラミングエラー(バグ)が発生した場合を区別することは困難です。

これは、企業開発のためのこれらのことについての私の個人的な見解です。私は、ほとんどの人がチェックされた例外を削除し、すべてをチェックされていない例外として処理することを義務付けていることを知っています(Scalaのように)。

于 2013-01-11T07:17:47.377 に答える
2

私の意見では、コード内で回復できる例外のみをキャッチする必要があります。他のすべての例外 (チェックされているかどうかにかかわらず) は、例外をログに記録し、ユーザーに一般的なエラー ページを表示する 1 つの uber exceptionhandler によってキャッチされる必要があります (おそらく、例外が何であったかを見つけるために使用できる ID を使用して)。

たとえば、struts2 では次のようにします。

<global-exception-mappings>
    <exception-mapping exception="java.lang.Exception" result="unrecoverableException"/>
</global-exception-mappings>

私はSpring MVCを使用したことはありませんが、この記事では、超例外ハンドラのオプションを提供しているようです:

http://doanduyhai.wordpress.com/2012/05/06/spring-mvc-part-v-exception-handling/

于 2013-01-11T07:24:27.367 に答える
1

このアプローチを使用して、ランタイムの予期しない例外をキャッチできます。

  try {
  ...
  } catch ( Exception e ) {
  throw new RuntimeException("msg",e);
  }  
于 2013-01-11T05:31:01.557 に答える
0

RuntimeException は、契約違反や回復不能な障害などの状況向けに設計されていると思います。ほとんどの場合、コンテナまたは外部インフラストラクチャに処理を任せるべきです。または、それらに対処するために多くの冗長なコードを作成する必要があり、Spring の設計哲学に反するものです。

あなたの場合、他の一般的なメッセージに本当に転送する必要がある場合は、フィルターまたはインターセプターを活用して予期しない RuntimeException をキャッチできる場合があります。

于 2013-01-11T11:23:19.043 に答える