抛出std :: exception(或衍生类型)的其他东西有什么好处吗?

时间:2013-05-28 14:44:28

标签: c++ exception-handling

是否有任何优点或用例抛出std :: exception(或衍生类型)的其他东西。

例如throw 1;throw "error";

换句话说,为什么c ++标准允许它。

5 个答案:

答案 0 :(得分:5)

按照§15.1[除]:

  

异常处理提供了一种转移控制的方法   信息从执行线程到异常   与先前由执行传递的点相关联的处理程序。

信息这个词说明了一切,它可以是对象,数字......等所有内容。

标准中没有任何内容表明您必须抛出std::exception。换句话说,也许有人想要抛出自己的异常对象。

也许有人想使用异常处理来处理远离正常异常的事情。

答案 1 :(得分:4)

我无法想到为什么从std::exception派生的类通常不会更好的任何明显原因。

但是throw 1throw "Error"是有效的表达式,它们可能会减少“努力”创建,并且可能存在这样做的好处。从exception的构造函数中抛出exception类型的异常可能效果不好,所以有一个地方。

然而,这可能更像是一个哲学决定:由于可以使throw抛出任何类型的对象,因此允许它并不是一个坏主意。您对语言中的内容的限制越多,您对语言的可能使用的限制就越多。

答案 2 :(得分:3)

关于std :: exception的参考资料:

  

<强>的std ::例外

     

派生标准库组件抛出的所有对象   来自这堂课。因此,可以捕获所有标准异常   通过引用来捕捉这种类型。

通过抛出其他内容,例如NuclearPlantException,您可以分别处理异常和标准库中的异常。标准库可以抛出std::invalid_argumentstd::bad_allocstd::exception的子类型),您可以抛出LossOfCoolantNuclearPlantException的子类型。)

因此,至少有一个优势:将标准库异常与异常分开。因为如果你的铀有足够的可用空间,你不会抛出std::bad_alloc,所以任何异常都有明确的起源,可能使测试和调试更容易。


注意:有关更深入的讨论,请参阅问题Should I inherit from std::exception?

答案 3 :(得分:2)

是的,可以有优势。

最明显的是,what(例如std::exceptionstd::logic_error)的现有衍生产品的std::invalid_argument仅处理std::string或{{char * 1}}来指定异常的原因。如果您只与英语听众讨论,那可能会很好,但是如果您想使用what向不使用英语的人显示错误消息,那么匆忙就会变得笨拙。

如果您在整个程序中使用(例如)32位Unicode字符串,则通常更喜欢在异常处理中执行相同操作。在这种情况下,类似于标准中的层次结构,但对what参数使用32位Unicode字符串可能会使 lot 有意义。我认为你可以仍然使用std::exception作为该层次结构的基础,但是我们可以质疑你从中获得了多少(如果有的话)。

答案 4 :(得分:0)

在std :: exception甚至std ::成为一个想法之前的十年里,扔东西是在C ++中。出于向后兼容性原因,未将其删除。

那些选择不使用std ::的人肯定会这样,并抛出其他异常,可能是从库提供的某些基类派生的。在客户端代码中处理几个异常层次结构之前,这很好。因此,不反对使用std :: fully(设置new_handler以避免std :: bad_alloc)的新代码可能会重新调整其异常根类以使用std :: exception作为基础。

投掷非类似的东西,如整数或指针通常建议agaist,但在光环境中可以很有意义 - 在一个小的嵌入式项目中,启用例外,但只抛出一个枚举听起来很合理。

一般来说,如果语言允许抛出任何可复制对象,为什么要限制它?虽然我们有时间旅行,但强迫使用特殊的库类并不符合C ++的精神。