2012-12-28 6 views
5

私はカスタム例外を定義したいと思います。メッセージとして文字列の代わりにクラスを含めることができるかどうかを知りたいと思います。その理由は、より柔軟な構造で余分な情報を送ってほしいということです。例外に追加情報を含むオブジェクトを含めることはできますか?

+2

??? Throwキーワードは常にクラスで例外をスローします「の代わりに文字列をクラスを投げます」だから、あなたはいつもクラスを投げています。 – nitgeek

答えて

16

はい。 Exceptionから継承するクラスを作成するだけです。

class YourException : Exception 
{ 
    public YourException(SpecialObject thethingYouWantIncluded) 
    { 
     ExtraObject = thethingYouWantIncluded; 
    } 

    public SpecialObject ExtraObject { get; private set; } 
} 

その後、

throw new YourException(new SpecialObject()); 

catch (YourException ex) { /* do something with ex.ExtraObject here */ } 
6

はいあなたができる、一種の。

C#では、すべての例外はクラスであり、System.Exceptionのインスタンスまたはそれから派生したクラスです。カスタム例外を作成する場合は、Exceptionから継承する新しいクラスを定義するだけです。あなたが欲しい

このカスタムクラスでは、あなたは追加のどんなプロパティ、フィールドを追加することができますが、その他:

public class CustomException : Exception 
{ 
    public Object CustomThing { get; set; } 
} 

あなたがすべてにアクセスできるようになりますCustomExceptionあなたがタイプの変数に、このような例外をキャッチ他のどのクラスと同様に、定義したカスタムプロパティ。

ただし、はできませんすることはできません。Exception.Messageは文字列です。カスタムメッセージクラスはMessageプロパティを持ち、stringになります。変更することはできません。すべての関連情報を含むカスタム文字列を定義する必要があります。あなたのカスタムプロパティからの情報を返すためにMessageプロパティをオーバーライドすることができ、それはまだ文字列にする必要がある:

public class CustomException : Exception 
{ 
    public override string Message 
    { 
     get 
     { 
      if (this.CustomThing == null) 
      { 
       return base.Message; 
      } 
      else 
      { 
       return string.Format("Custom thing: {0}", this.CustomThing); 
      } 
     } 
    } 
} 
+0

+1のために: "しかし、あなたがすることができないことは、Exception.Messageが文字列であるという事実を変更することです。" – hometoast

関連する問題