嵌套try catch c ++中的问题

时间:2014-04-03 11:22:19

标签: c++

我在c ++中遇到嵌套式try-catch块的问题,

它没有完美地传递值(指针,可能范围是原因),在外部try-catch块中获取null

try{
     try{
          string e
          ...
          throw e.c_str();
        }
     catch(const char *a){
          throw a;    // I had also tried taking 'a' into another string object and then throwed it but it didn't work
     }          
   }
catch(const char *a){
   cout<<a<<endl;
}

4 个答案:

答案 0 :(得分:4)

当您在内部try块中抛出异常时,e string会在堆栈展开进程中被销毁,并且指向其缓冲区的指针不再指向有效的记忆位置。

一般规则是:按值抛出,按引用抓住

try
{
    try
    {
        string e
        ...
        throw e;
    }
    catch(string & a)
    {
        throw a;
    }
}
catch(string & a)
{
    cout << a << endl;
}

结果:https://ideone.com/nY0FYM

答案 1 :(得分:0)

您正在返回指向std::string本地对象的内部缓冲区的指针。当catch块进入范围时,该对象不再存在。你应该抛出字符串对象,而不是它的内部缓冲区。

答案 2 :(得分:0)

当抛出异常时,所有在堆栈上分配的变量(因为进入try{}阻塞到异常发生的位置)都会被破坏,作为称为堆栈展开的过程的一部分。因此,catch()中的指针指向已经释放的内存。您可以通过按值抛出来避免这种情况,因此将值复制到要抛出的异常对象。

答案 3 :(得分:0)

string超出范围,因此char const *指向狂野。要解决此问题,您可以抛出std::exception的衍生物(它将字符串作为构造函数参数),但捕获std::exception &。然后创建一个包含该字符串的异常对象,一切都很好。