我在C ++中使用了标准的异常处理方法。哪个是try {}和catch {}阻止。在我的代码中,func1()会抛出异常,而func2就是这样:
bool func2()
{
try{
func1();
}
catch(myException& e)
{
cerr << "error!" << endl;
return false;
}
return true;
}
但是当我运行我的代码时,会发生一件奇怪的事情。我从来没有达到抛出异常的代码,但我总是在catch块中到达返回false的行(但是cerr <<
的行也从未到达)。然后函数继续返回true。我不知道原因是什么。任何人都可以帮我解决问题吗?非常感谢你!
答案 0 :(得分:7)
如果您在编译器中使用任何优化标志(即非调试模式),则无法相信调试器会向您显示正确的执行行。你做了相互矛盾的陈述 - “return false”语句正在执行,但函数返回true。这是我能想到的唯一解释。
答案 1 :(得分:3)
正如@Mark Ransom所说,你可能已经启用了优化。为了帮助您理解goind是什么,这是编译器可能生成的代码的C ++等价物:
bool func2()
{
bool ret;
try{
func1();
ret = true;
}
catch(myException& e)
{
cerr << "error!" << endl;
ret = false;
}
return ret;
}
但是,当您在生成的代码上的return ret;
“行”时,原始代码中有两行行,您实际可以使用return false;
和return true;
。调试器不知道哪个是正确的,因此它显示第一个(实际上,它是生成调试器将使用的表的编译器,这是选择)。
如果您告诉编译器生成一个程序集文件并查看它,这将更加明显。假设这是x86,其中返回值在%eax
上,两个分支都将%eax
设置为1或0然后跳转或下降到公共函数结尾代码(这是它将在哪里实际上从函数返回。)
答案 2 :(得分:0)
在WinDbg(或gdb)中打开您的应用,并启用第一次机会异常(在WinDbg中通过sxe eh)。
答案 3 :(得分:0)
你怎么知道它返回错误?如果func2没有执行cerr并返回true,则听起来没有捕获异常,并且没有执行返回false。
如果您正在使用调试器,有时它会显示您在没有抛出异常的情况下位于catch块的右括号上,这可能会让您感到困惑。
答案 4 :(得分:0)
如果您正在点击返回true语句,则抛出另一种类型的异常?尝试添加一个catch(...)。
答案 5 :(得分:0)
我注意到cerr有时会表现得很糟糕,你试过用cout取代cerr吗?也只是尝试在异常块中放置两个cout。
答案 6 :(得分:0)
如果没有产生输出且功能为RETURNING为真。
然后没有异常逃避func1() 结果该函数返回true。
但是您可能遇到的问题是,在优化代码之后,无法将机器指令映射回C ++源代码(因为优化器可能会重新安排代码)。
我建议您尝试使用以下内容,以确保报告所有异常。
试试这个:
bool func2()
{
try
{
func1();
}
catch(MyException const& e)
{
std::cerr << "Error!: Cought My Exception\n";
return false;
}
catch(...) // Catch any other exceptions
{
std::cerr << "Error!: Unknown Exception detected\n";
/*
* To keep the same functionality of your original code
* Rethrow the unknown exception.
*/
throw;
}
return true;
}
答案 7 :(得分:-1)
使用调试模式,而不是优化模式。另外,请确保您没有写任何悬空指针。