2010-01-10 59 views
4

我经常想将有用的信息添加到异常消息中。由于Exception类的Message属性没有公共setter,因此一个选项是包装在另一个中引发的异常。包装异常

//... 
catch(Exception e) 
{ 
throw new Exception("Some useful information.", e); 
} 

这是不好的做法,如果是的话是什么是替代?

+0

+1不好意思编辑你的问题 – 2010-01-10 03:16:02

+0

哪种语言? C#? Java的?还有别的吗? – 2011-06-08 20:43:33

回答

3

最好创建一个新的异常,并指向原始异常。您可以打印出新的信息和来自旧例外的消息。

看到的InnerException

http://msdn.microsoft.com/en-us/library/system.exception.innerexception.aspx

此信息这是标准的做法,这就是为什么微软已经内置支持此到他们的Exception类。

+0

因此,问题中描述的方法是首选方法? – Ben 2010-01-10 03:09:52

+0

是的,没错。 – 2010-01-10 03:12:44

+1

我也会推荐这个答案,但我强烈反对使用'Exception'本身。写一个属于你自己的特定错误条件的异常类。然后,您可以编写一个实际将给定消息与“InnerException”消息连接起来的构造函数。 – Timwi 2010-08-01 08:42:04

3

这样做没有问题,但如果您有更多信息,我不会使用常规Exception类。调试问题越简单,您的例外就越具体。

1

看起来像Exception.Data属性是我所追求的。

+0

Exception.Data对于添加特定于上下文的信息非常有用。但是,它并不存在于所有语言(特别是Java)中。 – 2010-01-10 02:43:30

0

原始Exception已经有这些信息。除非您创建一个新的例如Exception这将带来一些意义。

0

需要注意的是,您尚未提供任何可能处理该异常的代码的新信息;您在调试问题时只提供了对开发人员有用的信息。这可能是你所追求的一切,但似乎有点短视。

我宁愿不抛出一个完全相同类型的异常,尤其是一个像Exception一样的异常,因为我可能能够处理ConnectionTimeoutException但无法处理PlanetExplodedException。我不知道如何处理一般的异常,而不是记录它。

+0

许多现有的异常对于可能处理它们的代码提供任何类型的信息都是无用的。包装会让事情变得更糟,但在很多情况下会让事情变得更好。除此之外,来自一个应用程序层的异常往往没有用处,只有多于一层的异常。如果数据库抽象层中的方法'Fnord'调用JoesDatabase上的方法,并且抛出JoesDatabaseException,调用'Fnord'的代码将不知道它是使用JoesDatabase还是FredsDatabase等。 .. – supercat 2012-12-16 04:38:05

+0

...所以它不会知道期望'JoesDatabaseException'。让抽象层捕获一个'JoesDatabaseException'并重新抛出一个'DatabaseLayerException'或其他任何可以让调用者有机会处理数据库问题而无需使用Pokemon异常处理。 – supercat 2012-12-16 04:39:23