C++ 抛出std::exception(或派生类型)之外的其他东西有什么好处吗

C++ 抛出std::exception(或派生类型)之外的其他东西有什么好处吗,c++,exception-handling,C++,Exception Handling,抛出std::exception(或派生类型)引发的其他事件是否有任何优势或用例 例如throw 1或抛出“错误” P>其他的术语,为什么C++标准允许它。 < P>我想不出有什么明显的原因,为什么一个类从 STD::异常< /代码>通常不会更好。p> 但是throw 1或throw“Error”是有效的表达式,它们可能需要更少的“努力”来创建,并且在某些情况下这可能是一种好处。从exception的构造函数中抛出exception类型的异常可能不会很好地工作,因此只有一个地方 然而,这可能更

抛出std::exception(或派生类型)引发的其他事件是否有任何优势或用例

例如
throw 1
抛出“错误”


<> P>其他的术语,为什么C++标准允许它。

< P>我想不出有什么明显的原因,为什么一个类从<代码> STD::异常< /代码>通常不会更好。p> 但是
throw 1
throw“Error”
是有效的表达式,它们可能需要更少的“努力”来创建,并且在某些情况下这可能是一种好处。从
exception
的构造函数中抛出
exception
类型的异常可能不会很好地工作,因此只有一个地方

然而,这可能更像是一个哲学上的决定:既然
throw
可以抛出任何类型的对象,那么允许它也不是一个坏主意。在一种语言中,你对事物的限制越多,你对一种语言的可能用途的限制就越大

根据§15.1[除外]:

异常处理提供了一种传输控制和 从线程执行点到异常的信息 与执行之前传递的点关联的处理程序

信息这个词说明了一切,它可以是一切,比如物体、数字等等

标准中并没有规定必须抛出
std::exception
。换句话说,可能有人想要抛出自己的异常对象


也许有人想使用异常处理来处理一些与正常异常相去甚远的事情

参考资料中关于std::例外:

std::异常

标准库的组件抛出的所有对象都是派生的 从这个班。因此,所有标准异常都可以被 通过引用捕获此类型

通过抛出任何其他异常,例如
NuclearPlantException
,您可以分别处理您的异常和标准库中的异常。标准库可能抛出
std::invalid_argument
std::bad_alloc
(子类型
std::exception
),您也可能抛出
lossofcountation
(子类型
nuarpatterexception

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



注意:有关更深入的讨论,请参见问题。

是的,可能有好处

最明显的是
std::exception
的现有派生的
what
(例如
std::logic_error
std::invalid_参数
)只处理
std::string
char*
来指定异常的原因。如果你只与讲英语的听众打交道,这可能没什么问题,但是如果你想使用
what
向不使用英语的人显示错误消息,那么它可能会很快变得笨拙


如果在整个程序中使用(例如)32位Unicode字符串,您通常更愿意在异常处理中使用相同的字符串。在这种情况下,类似于标准中的层次结构,但对
what
参数使用32位Unicode字符串可能很有意义。我想你仍然可以使用这个等级的基础上的<代码> STD::异常< /代码>,但是可以质疑你从这样做中得到了多少(如果有什么)。

投掷的东西在C++之前是在STD之前的十年::例外甚至STD::变成了一个想法。由于向后兼容的原因,未删除此项

那些选择不使用std::的人当然喜欢这样,并抛出其他异常,这些异常可能来自库提供的某个基类。在客户机代码中处理多个异常层次结构之前,一切都很好。因此,不反对完全使用std::的新代码(设置新的_处理程序以避免std::bad_alloc)可能会重新调整其异常根类,以使用std::exception作为基础

抛出非类的东西,如int或指针,通常建议不要抛出,但在光环境中可能会有完美的意义——在一个小型嵌入式项目中,启用异常,但只抛出enum听起来很合理


一般来说,如果语言允许抛出任何可复制对象,为什么要限制它?即使我们有时间旅行,强迫使用特殊的图书馆类也不会有C++的精神。p> 为什么应该禁止它?@soon:好问题:)另请参见“我应该从std::exception继承吗?”事实上,我写错了,现在已经编辑了。但是是的,这里有各种不同选择的理由。