siv*_*udh 121 c++ exception-handling
std::runtime_error
和之间有什么区别std::exception
?每种用途的适当用途是什么?它们为什么首先不同?
AnT*_*AnT 149
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与Windows
正如Loki Astari和unixman83在下面的回答和评论中指出的那样,exception
该类的构造函数不会根据C++标准采用任何参数.Microsoft C++有一个构造函数在exception
类中接受参数,但这不是标准的.本runtime_error
类有一个构造回吐参数(char*
这两个平台,Windows和Linux上).为了便携,更好地使用runtime_error
.
(请记住,仅仅因为您的项目规范说您的代码不必在Linux上运行,这并不意味着它永远不必在Linux上运行.)
Mar*_*ork 18
应该考虑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";
}
Run Code Online (Sandbox Code Playgroud)