Answers:
std::exception是唯一目的是用作异常层次结构中的基类的类。它没有其他用途。换句话说,从概念上讲,它是一个抽象类(即使在该术语的C ++含义中没有将其定义为抽象类)。
std::runtime_error是一个更专业的类,从派生而来std::exception,旨在在发生各种运行时错误时抛出。它有双重目的。它可以通过自身被抛出,或者它可以作为一个基类各种更专门类型的运行时错误异常,如std::range_error,std::overflow_error等你可以定义自己的异常类从降std::runtime_error,以及你可以定义自己的异常源自的类std::exception。
就像std::runtime_error标准库包含的一样std::logic_error,它也是从std::exception。
具有这种层次结构的目的是使用户有机会使用C ++异常处理机制的全部功能。由于'catch'子句可以捕获多态异常,因此用户可以编写'catch'子句来捕获异常层次结构的特定子树中的异常类型。例如,catch (std::runtime_error& e)将从std::runtime_error子树中捕获所有异常,让所有其他异常通过(并进一步飞向调用堆栈)。
PS设计一个有用的异常类层次结构(将使您仅在代码的每个点上都捕获感兴趣的异常类型)是一项艰巨的任务。您在标准C ++库中看到的是该语言作者为您提供的一种可能的方法。如您所见,他们决定将所有异常类型分为“运行时错误”和“逻辑错误”,然后让您继续处理自己的异常类型。当然,还有其他方法可以构造该层次结构,这可能更适合您的设计。
更新:可移植性Linux vs Windows
正如Loki Astari和unixman83在下面的答案和注释中指出的那样,exception根据C ++标准,该类的构造函数不接受任何参数。Microsoft C ++具有在exception类中接受参数的构造函数,但这不是标准的。本runtime_error类有一个构造回吐参数(char*这两个平台,Windows和Linux上)。为了便于携带,更好地使用runtime_error。
(请记住,只是因为您的项目规范说您的代码不必在Linux上运行,并不意味着它永远不必在Linux上运行。)
std::exception。当然,所有std事物都抛出该类的派生类,但是绝对没有理由仅抛出std::exception派生对象。
std::exception应该被视为(注意被考虑的)标准异常层次结构的抽象基础。这是因为没有传递特定消息的机制(为此您必须派生和专门化what())。没有什么可以阻止您使用std :: exception,对于简单的应用程序,可能只是您所需要的。
std::runtime_error另一方面,具有接受字符串作为消息的有效构造函数。当what()调用时,将返回const char指针,该指针指向一个C字符串,该字符串与传递给构造函数的字符串相同。
try
{
if (badThingHappened)
{
throw std::runtime_error("Something Bad happened here");
}
}
catch(std::exception const& e)
{
std::cout << "Exception: " << e.what() << "\n";
}
std::exception(std::string)。现在我意识到,std::runtime_error如果我想让我的代码在Linux(GCC)中运行,我必须抛出。