2009-05-02 22 views
0

私は契約を履行するために2つの操作を行わなければならないBOメソッドを持っています。C#契約の実装と例外

  1. デシベル
  2. にレコードを挿入、レコード

両方がアクションを完了するための責任者DAOのメソッドの呼び出しで処理されるためのメタデータを含む電子メール通知を送信します。

私はDAOで例外をトラップしません。私はBOで処理して公開します。最初の呼び出しは、挿入するDAOへの呼び出しであり、NullReferenceExceptionまたはSQL例外の1つをスローすることができます。電子メールメソッドは、多数の例外をスローする可能性のあるSmtpClient.Sendを使用します。

電子メール機能を呼び出す子メソッドが、属性を介して1つの例外(カスタム)を返すように強制することはできますか?

public void AddSupportTicket(SupportTicketDTO ticket) 
{ 
    try 
    { 
     supportTicketDAO.Insert(ticket); 
     email.SendNotification(ticket); 
    } 
    catch (ExceptionA exc) { ... } // both of the methods can throw exceptions that 
    catch (ExceptionB exc) { ... } // can overlap. I just care about returning  
    catch (ExceptionC exc) { ... } // a custom EmailException or DataException 
} 

は私が独自のトライキャッチでそれぞれの子のメソッド呼び出しをラップし、私が欲しいカスタム例外を投げることができますが、別のtryキャッチによって捕獲されますトライキャッチのちょうど別のレベルのthats:

は、このことを説明するために、 AddSupportTicketで、UI内の1つがインテリジェントなエラーにリダイレクトされるので、それは私にとっては素晴らしいことではありません。

正しいカスタム例外を効率的にスローするにはどうすればよいですか?

+0

のようなものを持っているでしょうので、与えられた関数からスローすることができる例外の種類を指定することができますが、WCFを使用している場合、あなたはカスタム例外が必要だと思うなぜ私は考え直すでしょう。あなたがそれに与えることができると思われる追加情報はありますか? –

+0

これは良い動作だと思う - 時には。レイヤーのAPIを使用しやすくするために制限し、呼び出し側がより多くのログのエラーを処理できるようにします。 –

+0

私はPreetに同意します。契約履行の例外を使用してAPI/LOBレイヤーを実装する方がはるかに洗練されています。ビジネスメソッドにとって不可欠な値ではないエラーコードを返すことを管理することは、奇妙で、時には難しいことがあります。 – blu

答えて

1

はい、それは非常に可能です。エンタープライズライブラリexception handling blockをチェックしてください。盛り上げ、ラッピング、レイヤー間の例外の記録、ポリシーの設定など、たくさんの素晴らしい機能が用意されています。ロギングアプリケーションブロックと組み合わせることで、強力な組み合わせです。

+0

私はエンタープライズライブラリのアプローチが気に入っていますが、それを例外として使用することを控えているので、他のものを動かすことに集中することができます。しかし、その全体的な素晴らしいアプローチは、+1 – blu

0

は、属性について知らないが、あなたはあなただけで行うことができませんでした。

try{ 
... 
} catch(Exception ex) { 

    throw new MyException("Some biz msg", ex); 
} 
0

C#は、Javaのthrowsキーワードのような機能を提供していません。あなたのコードがXMLドキュメント標準を介してスローする例外の種類を文書化することはできますが、契約上強制的にこれを強制する方法はありません。

あなたの最善の策は、あなたのアプリケーションのすべてのレベルで適切なドキュメントとインテリジェントな例外処理です。

1

あなたのサービス・インターフェースで使用すると、

[OperationContract] 
[FaultContract(typeof(MemberAlreadyExistsException))] 
void MemberInsert(Member mu); 
+0

私はこれが好きですが、私の層はアセンブリで参照され、サービスによって浮上しません。私は、しかし、複数の負荷バランスのとれたWebボックスのアプローチが好きです。 +1 – blu