2017-06-22 22 views
2

私はDAOクラスで一般的な例外をキャッチし、DaoExceptionにラップします。これを行う主な理由は、EBeanは保存に失敗した場合に別のランタイム例外をスローしているため、それらを上位レイヤに伝播したくないということです。上位レイヤーは、保存が成功したかどうかだけを知る必要があります。DAOレイヤーの一般的な例外をキャッチするのは悪い習慣ですか?

以下はコードスニペットです。

public void save(Object object) throws DaoException { 
     try { 
      Ebean.save(object); 
     } catch (Exception e) { 
      throw new DaoException("Error saving record", e); 
     } 
    } 

これは一般的な例外がキャッチされるべきではないという一般的な考え方に反します。

しかし、これはこのシナリオで許容されるか、それでもなお悪い習慣ですか?

私の質問に追加することがさらにいくつかあります。 私の正確な要件は、

  1. は私がトランザクションにして永続化する必要がある独立したオブジェクトで設定されているがあります。 (他のインスタンスが同時に同じオブジェクトに変更を加えるのを避けるためにトランザクションでこれを行う必要があります)

  2. エラーが原因で1つのオブジェクトがパースに失敗する場合は、さらに他のオブジェクトを保持する必要があります。 (Czは独立しています)

私がサービスレイヤーで行っていることは、オブジェクトのセットをループしていることです。 1つのオブジェクトからDaoExceptionを受け取った場合は、エラー応答に追加してもループを続行します。しかし、それは取引を中断すべきではありません。 この要件を満たす良い方法はありますか?

+0

保存関数が別の型を投げているのはなぜですか? –

+0

https://stackoverflow.com/questions/21938/is-it-really-that-bad-to-catch-a-general-exception?rq=1の可能性のある複製 – scottb

答えて

1

例外処理では、次に示す親指の規則は次のとおりです。早くキャッ​​チし、後で処理します。

Dao層では、Excepionの特定のタイプが発生したときにアクションを実行する場合は、汎用Exceptionクラスではなく特定の例外を捕捉する必要があります。

例:spring jdbcを使用する場合、さまざまなタイプのexceptions をキャッチすることができるため、そのデータベース操作の再試行を実行するか、ロックが取得されるまで少し待つなどの処置を取ることができます。

しかし、例外状況が発生した場合にDaoレイヤーで処理する必要がない場合は、外部クラスでその例外を処理することをお勧めします。

関連する問題