【发布时间】:2015-05-12 00:06:53
【问题描述】:
我的大型应用程序有这样的结构:
int main()
{
try {
...
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
return 1;
}
}
在调用堆栈的深处,各种对象检查它们的内部状态,如果它们检测到错误,则抛出std::runtime_exception。包罗万象的异常处理程序会捕获它,打印一些适度有用的信息并终止程序。
但是,当我在 MS Visual Studio 下调试时,我可以从没有任何异常处理程序中受益:Visual Studio 有自己的非常有用的处理程序,它会在引发异常的地方停止我的应用程序,所以我可以检查出了什么问题。
如何有条件地捕获我的异常?
我尝试了以下方法:
try {
...
} catch (std::exception& e) {
if (IsDebuggerPresent())
throw;
else
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
这给出了一个奇怪的结果:Visual Studio 捕获了被重新抛出的异常,并向我显示了抛出异常时的堆栈跟踪。但是,我的应用程序中的所有对象显然都被破坏了,我看不到例如局部变量或成员变量。
我可以使异常处理程序以编译标志为条件:
#ifdef NDEBUG
try {
#endif
...
#ifdef NDEBUG
} catch (std::exception& e) {
std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
}
#endif
但这很不方便,因为如果我想调试它,我必须重新编译所有东西。
那么,我怎样才能使我的异常处理有条件(例如,取决于命令行参数)?
【问题讨论】:
-
尝试
Debug->Exceptions并勾选“Break on throw”框以获取您想要捕获的异常。 -
更好的方法是有条件地抛出一个你的处理程序根本无法捕获的异常(通过间接级别),让调试器来抢夺'时间。
-
如果@CompuChip 的方法适合你,那绝对是这两个中更好的。
标签: c++ visual-studio debugging exception