2017-02-17 13 views
0

私はDAOで作業していますが、例外を処理する最良の方法が何であるか把握できません。 .persist()を使用している間は、3つの例外、EntityExistsException/IllegalArgumentException/TransactionRequiredExceptionが発生する可能性があります。JavaEE EntityManagerの例外処理

私は例外をキャッチしてスローするための最良の方法が何であるか疑問に思っています(上位レベルで処理したい)。

単純な例外をキャッチしてスローするか、上記の例外を別々にキャッチする方が効率的ですか?

まず方法、私は例外をキャッチし、それを投げる:

public void addAccount(final Account accountToAdd) throws AccountJpaException { 

    try { 
     em.persist(accountToAdd); 
    } catch (Exception e) { 
     throw new AccountJpaException(e); 
    } 

    } 
} 

第二の方法:私は

public void addAccount(final Account accountToAdd) throws AccountJpaException, AccountExistsException { 

    try { 
     em.persist(accountToAdd); 
    } catch (EntityExistsException e) { 
     throw new AccountExistsException(e); 
    }catch(IllegalArgumentException e){ 
     throw new AccountJpaException(e); 
    }catch(TransactionRequiredException e){ 
     throw new AccountJpaException(e); 
    } 

    } 
} 

個別にそれらの一つ一つをキャッチし、あなたのアドバイスをありがとう!

+2

これらのうちのどれかを実際に捕まえるべきではありません。特に 'IllegalArgumentException'や' TransactionRequiredException'ではありません。 – Kayaman

+0

なぜですか?未処理の例外はいくつかの混乱を招くかもしれないか、私はこの点で全く間違っていますか? – raik

+2

あなたの質問が言うように、あなたはより高いレベルでそれらを扱うべきです*。 –

答えて

0

ほとんどのN層アプリケーションは、サービスクラス上でトランザクションの境界を特定します。このようなタイプの例外をキャッチして、このロジック処理をDAOにプッシュするのではなく、ここでユースケース固有の例外をスローする方が適切です。

2つの異なるサービスクラスの実装でDAOメソッドが使用されていることを考慮してください。ビジネスドメインのさまざまな問題に対処することが考えられるため、スローされる例外はドメイン固有のものにする必要があります。

2つ目のアプローチをとった場合、これらの例外をキャッチし、DAOからの例外をスローすると、例外がキャッチされ、サービスレベルで過剰な例外が再現されます。

私の経験則は、サービス/ドメインレベルでこれらのタイプのケースをキャッチし、そこからドメイン固有の例外を伝播し、適切なWebページを表示する特定のエラーハンドラ例外の種類に基づくビューなどがあります。