gpt4 book ai didi

c++ - 关于异常处理的一些问题

转载 作者:太空狗 更新时间:2023-10-29 20:06:42 24 4
gpt4 key购买 nike

请查看演示代码:

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();
}

我的问题:

  1. 为什么只有 function try block 的 ctor 和 dtor 处理程序才重新抛出异常? ,

当您只是在 ctor 中抛出异常时,它的处理程序不会重新抛出对象?即

Ctor::Ctor()
{
try{
throw Excep1();
}
catch(Excep1& temp) {
std::cout<<"Doesn't rethrows the exception object";
}
}
  1. 我想知道如何将控制恢复到 cout << "Resumed execution!" << endl; , 在处理重新抛出的对象之后?

  2. 为什么常说我们不应该将函数try block 放在基类的dtor上?

最佳答案

通常的规则是 catch block 不会重新抛出,除非您提出要求到。您将如何阻止异常传播。在但是,对于构造函数,如果初始化中有某些内容list throws,那么你还没有得到一个完整构造的对象;有你不能对这个对象做任何事情,甚至不能调用析构函数它。如果构造函数的函数 catch block 没有重新抛出,它会做什么,因为它不能简单地返回(和将变量留在堆栈上)?

在所有其他情况下,由包含 catch block 的函数执行知道该怎么做。例如,对于您的主要客户,您可以写: 尝试 { ab bb; } 捕获 (...) { } std::cout << "恢复执行!"<< 标准::结束;

你不能做的是执行 bb 范围内的代码,并且可访问,但未正确构建。

至于为什么你不应该在一个函数的析构函数上放置一个函数 try block 基类,我从来没有听说过这个规则。一般来说,析构函数不应该抛出,所以没有必要将它们包装在 try block 中,期间。

关于c++ - 关于异常处理的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6523275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com