3

根据这篇文章,使用 Exception 类的 Message 字段并不是一个好的编程习惯。

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

而不是使用:

throw new ArgumentException("My Custom Info.");

我应该使用:

ArgumentException ex = new ArgumentException();
ex.Data["CustomInfo"] = "My Custom Info.";
throw ex;

如果我不使用 Message 字段,代码会变得很麻烦。

不使用 Exception 类的 Message 字段是一种好习惯吗?

提前致谢。

4

6 回答 6

5

我实际上会建议该Message领域是至关重要的。Message您应该始终在您的领域中拥有“真实”的信息。

问题更多在于尝试将数据放入消息本身。如果您需要自定义数据与您的异常一起传递,那么创建一个自定义异常类,将数据作为属性,是一种更好的做法。这并不意味着您不应该有Message- 您的自定义异常,以及任何与此相关的异常,都应该有一个明确的消息来描述问题所在,但是作为有效负载发送的任何其他数据都应该通过自定义Exception类处理。

于 2013-07-04T16:35:07.400 回答
1

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

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

public CustomException(string message, string customInfo) : base(message) {
  CustomInfo = customInfo;
}

customInfo参数将填充类中的只读属性:

public string CustomInfo { get; private set; }

像这样使用它:

throw new CustomException("My message", "My Custom Info.");

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

于 2013-07-04T16:35:00.207 回答
1

自定义异常是要走的路。查看以下链接。

在 C# 中实现自定义异常的行业标准最佳实践是什么?

http://msdn.microsoft.com/en-us/library/vstudio/ms229064%28v=vs.100%29.aspx

于 2013-07-04T16:40:02.077 回答
1

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

http://msdn.microsoft.com/en-us/library/seyhszts.aspx

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

http://msdn.microsoft.com/en-us/library/dn169621.aspx

于 2013-07-04T17:32:38.653 回答
0

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

public class MyException : Exception
{
    public MyException() : base("The text you want")
    {
        // you can add here helpLink, Hresult and etc.
        this.HelpLink = "http://whateverurl";
    }
}
于 2013-07-04T16:39:20.090 回答
0

提到的文章:

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

这很愚蠢。例外是例外,您分析的任何内容都无法挽救这种情况。异常不应成为正常应用程序流程的一部分。因此,将诊断信息放在哪里并不重要。

我总是使用Message来提供信息。这是最简单的方法,并且可以使用ToString()它来打印异常详细信息。

我在这里写了一个关于异常处理的系列:http: //blog.gauffin.org/2013/04/what-is-exceptions/#.UdWxqflplc4

于 2013-07-04T17:32:31.560 回答