我可以在例外中包含一个携带附加信息的对象吗?

时间:2012-12-28 17:17:33

标签: c# exception

我想定义一个自定义异常,我想知道我是否可以包含一个类而不是字符串作为消息。原因是我想在一个更灵活的结构中发送额外的信息。

2 个答案:

答案 0 :(得分: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 */ }

答案 1 :(得分: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);
            }
        }
    }
}