C++获取了catch(...)块中捕获的异常的描述

MBZ*_*MBZ 24 c++ exception try-catch

我可以获得被捕获的异常的描述吗?

catch(...)
Run Code Online (Sandbox Code Playgroud)

块?像std :: exception的.what()之类的东西.

Ste*_*sop 40

您可以使用一个技巧:

catch(...) {
    handle_exception();
}

void handle_exception() {
    try {
        throw;
    } catch (const std::exception &e) {
        std::cout << e.what() << "\n";
    } catch (const int i) {
        std::cout << i << "\n";
    } catch (const long l) {
        std::cout << l << "\n";
    } catch (const char *p) {
        std::cout << p << "\n";
    } catch (...) {
        std::cout << "nope, sorry, I really have no clue what that is\n";
    }
Run Code Online (Sandbox Code Playgroud)

等等,你可能会抛出许多不同的类型.如果你真的什么都不知道什么可能会抛出,那么即使是倒数第二个也是错误的,因为有人可能抛出一个char*并不指向以空字符结尾的字符串.

抛出任何不是std::exception派生类或派生类的东西通常是个坏主意.std::exception存在的原因是允许每个人抛出并捕获他们可以做一些有用的对象.在玩具程序中你只想离开那里,甚至不能打扰包含一个标准的标题,好吧,也许扔一个int或一个字符串文字.我不认为我会成为正式界面的一部分.您抛出的任何异常都是正式界面的一部分,即使您以某种方式忘记记录它们.

  • 你好; 这是一个很好的答案.我一直在寻找一些时间在标准文件中找到证据证明这是标准行为,但一直无法找到.您是否确定这是标准行为?(也就是说,在`catch(...){}`中输入一个新的`try`-block并重新抛出异常以确定它的类型.) (2认同)

Pup*_*ppy 5

该块可能捕获一个int,或一个const char*,或任何东西.当编译器对它一无所知时,编译器怎么可能知道如何描述呢?如果要从异常中获取信息,则必须知道类型.

  • "当编译器对它一无所知时,编译器怎么可能知道如何描述?" - + 1,但实际上,编译器确实对它有所了解.异常机制必须存储*某些*类型信息,因为它必须将异常对象与catch子句匹配.但是标准没有定义这些信息或提供对它的访问,它是一个隐藏的实现细节. (5认同)