2012-02-13 23 views
19

私のDao層がDao固有の例外をスローすると、私のサービス層でそれらを処理すると懸念が払われますか?はいの場合は、例外を一般的なものにする必要があります。また、それに対応するレイヤーとは独立している必要がありますか?サービス層のDao例外の処理

サービスレイヤによって送出されたUIレイヤ処理の例外にも同じ質問が当てはまります。

答えて

27

レイヤードアプリケーションを作成する場合、常にユーザーレイヤと別の使用レイヤがあります。この場合、UIレイヤ - >サービスレイヤ - >はDAOレイヤを使用します。

これは非常に主観的で解釈が自由です。しかし、目的はデカップリングの良い度合いでなければなりません。これを実現するには、一般的な定義のレイヤー固有の例外PersistentExceptionServiceExceptionなどがあります。これらの例外は、実際のレイヤー固有の例外をラップします。たとえばについては

は、データベース側で何らかのエラー(制約違反など)がある場合と言う、PersistentExceptionでそれをラップし、サービス層は

を(一般的な方法でUI層にこれを伝えるためにどのようにのように)それを処理してみましょうサービス層とDAO層との間統合契約(インターフェースベース)であるため、

は今、DAO層は、それがインターフェース契約に従うと何にでも実装を変更して自由です。したがって、いくつかの新しい例外をスローする実装を変更すると、これらの新しい例外はPersistentExceptionにラップされます。サービス層は影響を受けずに残ります

userDAO.persist(user); 

例外操作は同じように考慮されるべきであると同じようにAPIの一部である、:あなたのような操作を行う際に

+0

これの例を教えてください...ありがとうございます –

+0

私はいつかこの記事を投稿しました。確認してくださいhttps://dzone.com/articles/quotdecouplingquot-the-exception-puzzle – Santosh

+0

ありがとう、ありがとう、私はそれを通過します –

0

良い質問です! UIレイヤーで例外を処理する(たとえば、ストラットを使用している場合はactionsレイヤー)が良いアプローチです。例外をジェネリックにすることは、この問題を処理する良い方法ではありません。しかし、すべてのレイヤーは特定の例外を汎用として持つべきです。例えば、DAO層にはDavaSavingException、IOExceptionなどのカスタム例外ハンドラがあるかもしれません。

したがって、DAOからサービス層に例外がスローされ、再びUIレイヤーにスローされ、UI固有のクラスがキャッチされます。

しかし、あなたのアプリケーション/ニーズに応じて、物事はあまりにも外交的です。

+0

より良いおかげで聞こえるが、私はまだですサービス層のDao例外を処理することが懸念の漏れを構成しているかどうかが明確ではなく、そうであれば、その処理方法。 – shrini1000

+0

「懸念の漏れ」とは?サービスレイヤやDAOレイヤで処理されても、DAO固有の例外は懸念されない場合があります。 – Ved

+0

私はこれを意味しています:Daoの例外には、Daoの問題に固有の情報が含まれている場合があります。今サービス層が例外を処理するためにこの情報を処理しなければならない場合、サービス層はDao層と緊密に結合しないでしょうか? Daoからサービスへの懸念の漏れを構成するものではありませんか? – shrini1000

8

はい。各レイヤーに独自の例外を作成することをお勧めします。

たとえば、特定のDAO実装を使用している場合は、実装固有の例外を独自の汎用例外にラップし、サービスレイヤに転送する必要があります。

しかし、アプリケーション開発のオーバーヘッドではなく、サービスレイヤで必要な情報を維持できるように、独自の階層構造を作成することに注意する必要があります。ほとんどの場合、一般的な例外を持つカスタムエラーコードで十分です。

何かを実装固有の例外をシミュレートするために使用して、サービスレイヤにスローすることができます。 DAO実装から投げる

class AppDAOException extends Exception { 
    public final static int _FAIL_TO_INSERT = 1; 
    public final static int _UPDATE_FAILED = 2; 
    public final static int _SQL_ERROR = 3; 
    private int errorCode; 
    public AppDAOException(int errorCode) { 
     this.errorCode = errorCode; 
    } 
    public getErrorCode() { 
     return errorCode; 
    } 
} 

懸念の漏洩について
try { 
    //code here 
} catch (some.impl.SQLSyntaxException e) { 
    throw new AppDAOException (AppDAOException._SQL_ERROR); 
} 

: あなたはあなたのサービス層は、すべての例外について悩むしたくないかもしれない - など:だから

} catch(NoRowExistsException e) { 
    return null; 
} finally { 
    //release resources 
} 

アプリケーションのニーズに基づいて呼び出しを行う必要があります。

6

あなたのDAO層は、すでにサービス層に漏れ出します。

try { 
    userDAO.persist(user); 
} catch (DAOException e) { 
    // looks fine to me 
} 

漏れは実行時例外を発生する可能性があります、またはあなたは例外

try { 
    userDAO.persist(user); 
} catch (SQLException e) { 
    // sql implementation exposed 
} 

を再スローするときしかし、たとえこれが答えのための「層の独立した」例外