如何有条件地捕获异常?

ana*_*lyg 6 c++ debugging exception visual-studio

我的大型应用程序有这种结构:

int main()
{
    try {
        ...
    } catch (std::exception& e) {
        std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

在调用堆栈内部,各种对象检查其内部状态,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;
    }
Run Code Online (Sandbox Code Playgroud)

这给出了一个奇怪的结果:Visual Studio捕获了重新抛出的异常,并向我展示了抛出异常的位置的堆栈跟踪.但是,我的应用程序中的所有对象显然都被破坏了,我看不到例如局部变量或成员变量.

我可以使异常处理程序以编译标志为条件:

#ifdef NDEBUG
    try {
#endif
        ...
#ifdef NDEBUG
    } catch (std::exception& e) {
        std::cout << "Fatal error: " << e.what() << (some more data) << std::endl;
    }
#endif
Run Code Online (Sandbox Code Playgroud)

但这很不方便,因为如果我想调试它,我必须重新编译所有内容.

那么,如何使我的异常处理成为条件(例如,取决于命令行参数)?

ana*_*lyg 1

正如CompuChip建议的那样,Visual Studio 可以在引发异常时中断执行,而不仅仅是在捕获未捕获的异常时!

要启用此功能(在 Visual Studio 2012 中):

  1. 在菜单中,转到“调试”->“异常”
  2. 在打开的窗口中,勾选所有 C++ 异常的“抛出”框(仅勾选std::exception是不够的 - 我不知道为什么)
  3. 运行你的程序