关于异常处理的一些问题
Some Question regarding Exception handling
请看一下演示代码:
class myError
{
const char* str;
public:
myError():str(NULL) {}
myError(const char* temp)
{
str = temp;
}
const char* what()
{
return str;
}
};
class ab
{
int x;
public:
ab() try :x(0)
{
throw myError("error occured in the constructor of class ab");
}
catch(myError& temp)
{
std::cout<<"Handler no. 1 of ab constructor"<<std::endl;
}
};
int main () try
{
ab bb;
cout << "Resumed execution!" << endl;
return 0;
}
catch(myError& temp)
{
std::cout<<"Handler below the main function"<<std::endl;
std::cout<<"And the error is :" <<temp.what();
}
我的问题:
- 为什么只有函数try块的ctor和dtor的处理程序才重新抛出异常
当您简单地在ctor内部抛出异常时,它的处理程序不会重新抛出对象?即
Ctor::Ctor()
{
try{
throw Excep1();
}
catch(Excep1& temp) {
std::cout<<"Doesn't rethrows the exception object";
}
}
我想知道在处理了重新生成的对象之后,如何将控制恢复到
cout << "Resumed execution!" << endl;
?为什么经常说我们不应该把函数try块放在基类的dtor上?
通常的规则是catch
块不会重新抛出,除非你问它到。否则,您将如何阻止异常传播。在里面然而,构造函数的情况是,如果初始化中有什么东西list抛出,那么您还没有得到一个完全构造的对象;有你不能对对象做任何事情,甚至不能调用上的析构函数如果构造函数的函数catch
块没有重新思考,它将做什么,因为它不能简单地返回(以及将变量留在堆栈上)?
在所有其他情况下,包含catch
块的函数由用户决定知道该做什么。例如,在你的主菜的情况下,你可以写入:尝试{ab-bb;}捕获(…){}std::cout<lt;"已恢复执行!"<lt;std::endl;
您不能执行bb
在作用域和可访问,但尚未正确构建。
至于为什么不应该在基础课,我从来没听说过这个规则。通常,析构函数不应该扔,所以把它们包在试块里没有意义,时期
对于第二个问题,析构函数不应该抛出句点。考虑这样一种情况:析构函数通过delete
释放了大量内存。如果你的析构函数在完成清理之前抛出了一个错误,会发生什么?您现在有内存泄漏。如果您的析构函数导致运行时错误,那么您的代码中可能存在需要修复的其他问题。
和往常一样,Herb Sutter知道并解释了一切:
如果处理程序主体包含语句"throw;",那么catch块显然会重新抛出已经发出的异常A::A()或B::B()。不太明显但在标准中明确说明的是,如果catch块没有抛出(或者重新抛出原始异常,或者抛出新的异常),并且控制到达构造函数或析构函数的catch块的末尾,那么原始异常将自动重新抛出。
更多信息,请参阅他的文章
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- 异常处理问题,原因
- 异常处理语法问题简单
- 请纠正我的异常处理问题
- 关于异常处理的一些问题