是否可以在异常中包含携带附加信息的对象

本文关键字:信息 对象 包含携 异常 是否 | 更新日期: 2023-09-27 17:49:42

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

是否可以在异常中包含携带附加信息的对象

是。只需创建一个继承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 */ }

你可以,在某种程度上。

在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);
            }
        }
    }
}