在C#中不使用异常类的消息字段是一种好的做法吗?

在C#中不使用异常类的消息字段是一种好的做法吗?,c#,exception,error-handling,C#,Exception,Error Handling,根据,使用异常类的消息字段不是一个好的编程实践 但是,当我尝试在项目中抛出异常(例如,ArgumentException)时,如何添加自定义异常信息?我应该使用Exception.Data属性吗 而不是使用: throw new ArgumentException("My Custom Info."); 我应该使用: ArgumentException ex = new ArgumentException(); ex.Data["CustomInfo"] = "My Custom Info."

根据,使用异常类的消息字段不是一个好的编程实践

但是,当我尝试在项目中抛出异常(例如,
ArgumentException
)时,如何添加自定义异常信息?我应该使用
Exception.Data
属性吗

而不是使用:

throw new ArgumentException("My Custom Info.");
我应该使用:

ArgumentException ex = new ArgumentException();
ex.Data["CustomInfo"] = "My Custom Info.";
throw ex;
如果我不使用Message字段,代码就会变得很麻烦

不使用异常类的消息字段是一种好的做法吗


提前感谢。

如果需要自定义信息作为异常的一部分,通常建议创建自己的异常类,在其中创建单独的属性来构造信息

对于您的示例,相关异常构造函数可能如下所示:

public CustomException(string message, string customInfo) : base(message) {
  CustomInfo = customInfo;
}
throw new CustomException("My message", "My Custom Info.");
customInfo
参数将填充类中的只读属性:

public string CustomInfo { get; private set; }
像这样使用它:

public CustomException(string message, string customInfo) : base(message) {
  CustomInfo = customInfo;
}
throw new CustomException("My message", "My Custom Info.");

另外请注意,您链接的文章提到异常消息不是存储结构化信息的好地方,因为这将迫使客户端解析它以获取相关位,因为您必须将所有信息格式化为单个字符串。

我实际上认为
消息
字段至关重要。您的
消息
字段中应该始终有一条“真实”消息


问题更多的是试图将数据放入消息本身。若您需要自定义数据随异常一起传递,那个么使用数据作为属性创建自定义异常类是更好的做法。这并不意味着您不应该有一条
消息
——您的自定义异常,以及与此相关的任何异常,都应该有一条明确的消息来描述出错的原因,但是作为有效负载发送的任何附加数据都应该通过自定义
异常
类进行处理。

您可以通过以下方式创建自己的异常:

public class MyException : Exception
{
    public MyException() : base("The text you want")
    {
        // you can add here helpLink, Hresult and etc.
        this.HelpLink = "http://whateverurl";
    }
}

自定义异常是一种方法。查看以下链接

上述文章:

例外情况是类。返回异常信息时,请创建字段以存储数据。如果您未能做到这一点,人们将需要解析消息字段以获得他们需要的信息。现在,如果您需要本地化,甚至只是纠正错误消息中的拼写错误,那么思考调用代码会发生什么情况。您可能永远不知道这样做会破坏多少代码

那太傻了。异常是异常,您无法分析任何东西来挽救这种情况。异常不应该是正常应用程序流的一部分。因此,将诊断信息放在何处并不重要

我总是使用
消息
提供信息。这是最简单的方法,可以与
ToString()
一起使用,这是打印异常详细信息的第一步


我在这里写了一系列关于异常处理的文章:

阅读Microsoft推荐给开发人员的解决方案会很有帮助

如果您对企业级异常处理感兴趣,“异常处理应用程序块”将是最佳解决方案


我认为使用消息字段描述错误没有错。最终用户将真正看到的就是这些……对于某些API,有时区分一个无关错误和另一个无关错误的唯一方法是解析消息,因为它们抛出相同的异常类型,但消息不同。当然,这里没有人会这样做,对吗?
消息
字段可以是可选的,如果异常类型已经向您指示了错误的类型,例如使用
ArgumentNullException
。但是对于异常类作者来说,这不是可选的,正如您所提到的,他应该始终在那里提供“真实”的消息。