我在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;
}
答案 0 :(得分:4)
当您在内部try
块中抛出异常时,e
string
会在堆栈展开进程中被销毁,并且指向其缓冲区的指针不再指向有效的记忆位置。
一般规则是:按值抛出,按引用抓住。
try
{
try
{
string e
...
throw e;
}
catch(string & a)
{
throw a;
}
}
catch(string & a)
{
cout << a << endl;
}
答案 1 :(得分:0)
您正在返回指向std::string
本地对象的内部缓冲区的指针。当catch块进入范围时,该对象不再存在。你应该抛出字符串对象,而不是它的内部缓冲区。
答案 2 :(得分:0)
当抛出异常时,所有在堆栈上分配的变量(因为进入try{}
阻塞到异常发生的位置)都会被破坏,作为称为堆栈展开的过程的一部分。因此,catch()
中的指针指向已经释放的内存。您可以通过按值抛出来避免这种情况,因此将值复制到要抛出的异常对象。
答案 3 :(得分:0)
string
超出范围,因此char const *
指向狂野。要解决此问题,您可以抛出std::exception
的衍生物(它将字符串作为构造函数参数),但捕获std::exception &
。然后创建一个包含该字符串的异常对象,一切都很好。