根据this article,使用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字段是一个好习惯吗?
提前致谢。
答案 0 :(得分:5)
我实际上会建议Message
字段是关键的。您应该始终在Message
字段中显示“真实”消息。
问题更多的是尝试将数据放入邮件本身。如果您需要将自定义数据与异常一起传递,那么使用数据作为属性创建自定义Exception类是更好的做法。这并不意味着您不应该有Message
- 您的自定义异常,并且任何例外情况都应该有明确的消息来描述出错的地方,但是作为有效负载发送的任何其他数据都应该通过自定义Exception
类。
答案 1 :(得分: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.");
另请注意,您链接的文章提到异常消息不是存储结构化信息的好地方,因为这将迫使客户解析以获取相关信息比特,因为您必须将所有信息格式化为单个字符串。
答案 2 :(得分:1)
自定义异常是可行的方法。请查看以下链接。
What are industry standard best practices for implementing custom exceptions in C#?
http://msdn.microsoft.com/en-us/library/vstudio/ms229064%28v=vs.100%29.aspx
答案 3 :(得分:1)
阅读Microsoft向开发人员推荐的解决方案会很有帮助。
http://msdn.microsoft.com/en-us/library/seyhszts.aspx
如果您对企业级异常处理感兴趣,“异常处理应用程序块”将是最佳解决方案。
答案 4 :(得分:0)
您可以通过以下方式创建自己的例外:
public class MyException : Exception
{
public MyException() : base("The text you want")
{
// you can add here helpLink, Hresult and etc.
this.HelpLink = "http://whateverurl";
}
}
答案 5 :(得分:0)
上述文章:
例外是课程。返回异常信息时,请创建用于存储数据的字段。如果您没有这样做,人们将需要解析Message字段以获取他们需要的信息。现在,想想如果您需要本地化甚至只是纠正错误消息中的拼写错误,调用代码会发生什么。你可能永远不会知道你会破坏多少代码。
那太傻了。例外是例外,您分析的任何内容都无法挽救这种情况。异常不应该是正常应用程序流程的一部分。因此,在哪里放置诊断信息并不重要。
我总是使用Message
来提供信息。这是最简单的方法,适用于ToString()
,它是打印异常详细信息的第一步。
我在这里写了一系列关于异常处理的文章:http://blog.gauffin.org/2013/04/what-is-exceptions/#.UdWxqflplc4