2013-07-04 29 views
3

根据this article,使用Exception类的Message字段不是一个好的编程习惯。在C#中不使用Exception类的消息字段是一个好习惯吗?

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

而不是使用:

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

我应该使用:

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

的代码变得麻烦,如果我不使用信息栏。

不使用Exception类的Message字段是一种好的做法吗?

在此先感谢。

+1

我没有看到用消息字段描述错误没有错。这就是所有的最终用户将真正看到的...... –

+0

对于一些API,有时唯一的办法是区分一个不相关的错误和下一个错误是通过解析消息,因为它们抛出相同的异常_type_但是具有不同的消息。当然,这里没有人会这么做,对吧? –

回答

5

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

这个问题更多的是试图将数据放入消息本身。如果您需要将自定义数据与异常一起传递,那么使用数据作为属性来创建自定义的Exception类是更好的做法。这并不意味着你不应该有一个Message - 你的自定义异常,任何异常,应该有一个明确的信息来描述出了什么问题,但作为有效载荷发送的任何附加数据应该通过自定义的Exception类来处理。

+0

如果异常类型已经给出了你得到的错误类型的指示,那么客户端可以选择“消息”字段,带'ArgumentNullException'。但是,对于异常类作者来说,这不是可选的,正如你所提到的那样,他应该总是在那里提供一个“真实”的信息。 –

1

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

对于你的榜样,相关的异常构造看起来是这样的:

public string CustomInfo { get; private set; } 

使用方法如下:

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

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

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

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

0

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

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

所提到的文章:

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

这很愚蠢。例外情况是例外情况,您分析的任何情况都无法挽救这种情况。例外不应该是正常应用程序流程的一部分。因此,放置诊断信息的位置并不重要。

我总是用Message来提供信息。这是最简单的方法,并且与ToString()一起工作,这是排名第一的打印异常详细信息。

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

相关问题