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)中运行,我必须抛出。