2011-01-24 11 views
2

私はこのようになりますメンバーシップの例外があります。これは例外を使用する適切な方法ですか?

public enum MembershipError 
{ 
    EmailNotFound, 
    EmailNotConfirmed, 
    IncorrectPassword, 
    EmailExists 
} 

public class MembershipException : ApplicationException 
{ 
    public MembershipError MembershipError { get; set; } 

    public MembershipException(MembershipError membershipError) 
     : base(Enum.GetName(typeof (MembershipError), membershipError)) 
    { 
     MembershipError = membershipError; 
    } 
} 

は、私は私の例外で列挙型を使用するか、各列挙型の例外を作るべきか?このような例外をキャッチするとき、私はロジックを置くことになるので:私のサービス層は、これらの例外をスロー

try 
{ 

} 
catch (MembershipException exception) 
{ 
    switch (exception.MembershipError) 
    { 
     case MembershipError.EmailExists: 

      break; 
      //etc. 
    } 
} 

、アクションでWeb層は、/これらは、適切なJSONを生成および表示に戻すキャッチ。 代わりの方法を提案してください。

答えて

5

例外は、例外的な状況でのみ使用してください。あなたの列挙に列挙されたエラーはかなり標準的であるように見えます。私は例外を通してそれらを表現しないことにします。代わりに、私は例外よりもTryXXXスタイルAPIを好むでしょう。例えば

public bool TryGetMembershipData(
    string user, 
    out Data data, 
    out MemberShipError error) { 
    ... 
} 
+2

私は2つの 'out'を1つのクラスにマージして返します。 –

+0

@Lolcoder:しかし、ブール戻り値はどうですか? Tryメソッドを使用することのポイントのようなものです。また、新しいクラスを作るのではなく、 'Tuple'を使うことを検討してください。 – Brian

3

データ検証に例外処理を使用しているようです。これはまずは​​悪いデザインです。これらの検証チェックは、最終登録を行う前に個別に実行する必要があります。

+0

私のサービスレイヤーはこれらの例外をスローします。アクション内のwebレイヤーはこれらを捕捉し、適切なjsonを生成してビューに返します。 –

+0

サービスレイヤーを制御できますか? –

1

悪い考え。例外は一般に「例外的」な場合にのみ使用されるべきです。パフォーマンス上の問題も発生します。

0

これは非常にないPCに聞こえるかもしれないが、私は、ソフトウェアエンジニアリングはちょうどそれのために厳格な戒律を遵守するためにあなたを強制する宗教ではないと信じています。 ドスDontsための理論的な説明は、もちろん、ありますが、そこ考えると有害エッセイ、のトンがあるが、彼らは常に自分自身のケースに適用されていますか?

  1. あなたMembershipExceptionクラスは十分に特化しており、すべてのほとんどは、それはMembershipError列挙型だと維持するのは簡単です:

    はちょうど実用的とします。

  2. また、例外処理のコストは過大評価されることがあります。メンバーシップサービスレイヤは、結局のところリアルタイムフライトシミュレータではありません。ログイン失敗は、アプリケーションを無意味にすることはありません。読むために維持するために、簡単でシンプル:

ちょうどこのようにそれを維持します。

0

例外処理を使用する最良の方法ではないことを完全に正直に言うと、起こりうることが起こっている場合にのみ例外を使用するというルールがありますが、ここに表示されている例外はすべてエラーのように完全に処理できます。あなたのサービスがこれらのエラーを例外として返す場合は、そのエラーのメッセージを返すためにソフトウェアのその層をやり直す以外にはほとんどできません。

あなたがそれを行うことができない場合は、論理層の別のキャッチで例外のそれぞれをキャプチャする必要があります。

関連する問題