异常行为C 14 vs C 98
Exception behavior C++14 vs C++98
我写了以下程序
#include <iostream>
#include <stdexcept>
class Myclass
{
public:
~Myclass()
{
//throw std::runtime_error("second (in destructor)");
throw 1;
}
};
void fun()
{
Myclass obj;
}
int main()
{
try
{
fun();
}
catch (const std::exception& e)
{
std::cout << e.what();
}
catch(...)
{
std::cout << " ... default Catch" << std::endl;
}
std::cout << "Normal" << std::endl;
return 0;
}
当我以C++98
模式(cpp.sh(上方运行程序时,它会打印
... default Catch
Normal
当我使用C++14
模式运行它时,它不会打印任何东西。为什么此行为发生变化?
我确实理解,只要发生任何异常,并且任何destructor
(在堆栈放松过程中(会引发任何例外,则会终止应用程序。但是这里只有一次来自destructor
的try
块。
以来,由于C 11,没有明确阐明的异常规范具有与默认生成的一个相同的例外规范。在您的情况下,默认生成的破坏者将是 noexcept
(最多默认的驱动器是(,因此您的破坏者也被视为 noexcept
。从noexcept
函数抛出会自动调用std::terminate
。
如果您希望异常被捕获,请将击曲线声明为投掷:
~Myclass() noexcept(false)
{
//throw std::runtime_error("second (in destructor)");
throw 1;
}
但是,在您这样做之前,重新考虑。是一个不好的主意具有投掷破坏者。
抛弃灾难的异常总是一个坏主意,因为如果飞行中已经有一个例外(例如,在堆栈中调用的destructor在放松时称为destructor(std::terminate
将被称为。
也就是说,C 11向破坏者添加了一个隐式noexcept(true)
(下面列出的案例除外(,如果从noexcept(true)
Destructor中投掷,则同样是std::terminate
。
§12.4/3
[class.dtor] [注意:没有NOExcept特定符的攻击子的声明具有相同的例外 规格好像已被隐式声明(15.4(。 - 终注]
和§15.4/14
[exceed.spec] 隐式宣布的驱动器的例外规范,或没有NOExcept特定器的驱动器的例外规范, 当且仅当其任何潜在构造的子项目中的任何破坏者中,都可能进行攻击 可能投掷。
我强烈建议您按顺序重组您的代码不是扔进destructors。
- 处理多个异常集合的C++方法
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 从构造函数抛出异常时如何克服内存泄漏
- C :ScopeGuard vs返回支票和异常处理
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
- 异常行为C 14 vs C 98
- 切片std :: out_of_range to std ::异常在Visual Studio vs G 中
- 如何在 VS C++ 中查找发生异常的位置
- Null指针异常(int Vs char)
- 强异常保证VS基本异常保证
- 引发异常:VS 2012 中的访问冲突读取位置.(在VS2010中不是)
- 在vs 2010中运行c++的单元测试时出现异常
- Python输入和异常vs. c++
- 异常vs断言的科学计算家伙(我是我的代码的唯一用户)
- VS 2013 使用 C++11 不受限制的联合时出现异常