5

カスタム例外を定義したいのですが、メッセージとして文字列の代わりにクラスを含めることができるかどうかを知りたいです。その理由は、より柔軟な構造で追加情報を送信したいからです。

4

2 に答える 2

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 */ }
于 2012-12-28T17:20:46.577 に答える
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);
            }
        }
    }
}
于 2012-12-28T17:26:17.793 に答える