2

カスタム例外クラスを作成する理由は、少なくとも私にとっては、ドメイン オブジェクトなどの追加情報を転送する必要があるためです。
これを実現するために、例外クラスに読み取り専用プロパティを追加し、このプロパティを初期化し、null 以外の値のみを許可するコンストラクターを提供します。

現在、MSDNCode Analysisによると、すべての例外タイプには少なくとも 4 つの特定のコンストラクターが必要です。

最終結果は、カスタム プロパティ セットを持たないカスタム例外クラスのインスタンスを作成できることです。

これには 2 つの問題があります。

  1. すべての例外ハンドラーは、そのプロパティがnull
  2. 一部の例外ハンドラーは、その追加のプロパティがないと、何も役に立たないでしょう。

このジレンマを解決する方法は?

4

1 に答える 1

1

ドメイン オブジェクトのデフォルト値、おそらく Null オブジェクトを指定できますか? ( http://en.wikipedia.org/wiki/Null_Object_pattern ) そうすれば、例外ハンドラを賢くする必要はなくなります。メソッドまたはプロパティのいずれかが使用されたときに、ドメイン オブジェクトの Null オブジェクト インスタンスがまったく何もしないようにします。

もう 1 つの方法は、[SuppressMessage] を使用してコード分析メッセージを回避し、パラメーターがゼロのコンストラクターを持たないようにすることです。問題は、クラスがシリアル化できなくなったことです。これは、問題になる場合とそうでない場合があります。

最後に、DomainObjectExceptionHandler という中間クラスを作成することを検討してください。例外が発生した場合の処理​​を担当します。

 public abstract class DomainObjectExceptionHandlerBase {
     public abstract void HandleException();
 }

次に、実際のドメイン オブジェクトで例外が発生したときに何をすべきかを認識している実装を用意します。

 public class DomainObjectExceptionHandler : DomainObjectExceptionHandlerBase {
     private DomainObject domainObject;
     public DomainObjectExceptionHandler(DomainObject domainObject) {
         this.domainObject = domainObject;
     public override void HandleException() { 
         // do real recovery work with the domain object
     }
 }

そして、何もしない null オブジェクト:

public class NullDomainObjectExceptionHandler : DomainObjectExceptionHandlerBase {
    public override void HandleException() { 
        // do nothing
    }
}

これで、例外クラスに次の 4 つの推奨シグネチャを含めることができます。

public class DomainObjectException {
    public DomainObjectException() {
        this.Handler = new NullDomainObjectExceptionHandler();
    }

    public DomainObjectException(DomainObject domainObject) {
        this.Handler = new DomainObjectExceptionHandler(domainObject);
    }

    public DomainObjectExceptionHandlerBase Handler { get; private set; }
}

スローするコードは次のようになります。

if (domainObject.IsUnhappy())
    throw new DomainObjectException(domainObject);

例外ハンドラは次のようになります。

try {
    FrobulateDomainObjects();
} catch (DomainObjectException ex) {
    ex.Handler.HandleException();
}

例外ハンドラーが DomainObject の存在を知る必要がないことに注意してください。DomainObjectExceptionHandler に委任します。

于 2013-02-26T08:03:02.623 に答える