Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抛出C+时要抛出什么+;例外情况? 这可能是个愚蠢的问题,但是在C++中,当我想抛出一个异常…我扔什么_C++_Exception - Fatal编程技术网

抛出C+时要抛出什么+;例外情况? 这可能是个愚蠢的问题,但是在C++中,当我想抛出一个异常…我扔什么

抛出C+时要抛出什么+;例外情况? 这可能是个愚蠢的问题,但是在C++中,当我想抛出一个异常…我扔什么,c++,exception,C++,Exception,我应该抛出std::exception,还是标准库保留了它?还是应该抛出字符串或int?或者我应该抛出我认为合适的东西吗?抛出一个派生自std::exception的类;如果您#include,您可以从许多派生类中进行选择 从std::exception派生允许处理程序遵循可识别的样式,因为您可以始终使用.what()获取文本消息。不要抛出基元类型,因为它们没有语义信息。通常人们不会直接抛出std::exception,原因很简单,因为它不存储任何错误消息。what方法不会返回任何内容。我有时会

我应该抛出std::exception,还是标准库保留了它?还是应该抛出字符串或int?或者我应该抛出我认为合适的东西吗?

抛出一个派生自
std::exception
的类;如果您
#include
,您可以从许多派生类中进行选择


std::exception
派生允许处理程序遵循可识别的样式,因为您可以始终使用
.what()
获取文本消息。不要抛出基元类型,因为它们没有语义信息。

通常人们不会直接抛出std::exception,原因很简单,因为它不存储任何错误消息。what方法不会返回任何内容。我有时会对此感到困惑,因为MSVC提供了一个非标准的扩展,它是std::exception中接受字符串的参数化构造函数

您可以在现有的异常类(如std::runtime\u exception)中进行选择,也可以定义自己的异常类。这有点主观,但我建议尽量减少异常类的数量,因为RAII可以消除对不同异常类型的多个代码分支和捕获块的大量需求。通常,消息与符合RAII的代码相结合就足以从任何异常中优雅地恢复


最后,出于类似的原因,我建议您抛出的所有异常都继承自std::exception。如果可以避免的话,您不想在代码中为不同的异常类型添加许多不同的catch块。尽可能普遍地解决问题。

与java不同,您可以抛出任何想要的(
int、string、MyClass、
)。但请听克里的话。:)

通常您会希望抛出一个从
std::exception
派生的异常,正如其他人所说


有时我会抛出其他类型,但前提是它被捕获在同一块中,并且该值在该上下文中是有用的。

抛出从
std::exception
派生的内容的主要异常是,如果您使用的框架(例如MFC)具有自己的异常层次结构。在这种情况下,您通常希望从其层次结构中的适当位置派生

请注意,我并不是特别想把MFC作为一个干净异常处理(或一般来说干净设计)的示例,只是一个包含异常层次结构的框架示例。当您使用已经定义了异常层次结构的框架时,通常最好使用它


换句话说,不同于C++中的偏好,一般认为异常应该是单个的、具有单个根的单片层次结构。对于标准库,这个单根是

std::exception
,但其他框架也有其他选择,如果它们提供了一个,您通常希望将自己的根放入其中。

不要抛出字符串或int!如果您总是抛出
std::exception
的子类,您可以在
main
中放置一个catch all子句,该子句处理其他地方未处理的所有异常,并打印异常的
what()
。我会反驳(尽管实际上是相同的)在大多数情况下,人们应该从std::runtime\u错误派生异常(它本身恰好是从std::exception派生出来的)如果您捕获的是“在同一块中”,那么您可能不应该首先抛出异常。异常是针对异常情况的,但是如果您可以在那里处理该情况,那么听起来它只是正常程序流的一部分。(别忘了,抛出异常可能比只检查某个本地状态要昂贵得多。)@KerrekSB,我不记得我做这件事的确切情况,但我确信这是一个例外情况,不是正常流程的一部分。可能在替代方法更丑陋的地方也有很深的嵌套。足够公平。在某些情况下,例外可以使复杂的算法更清晰、更容易理解D