关于Python:我如何知道C++中异常的名称?

How can I know the name of the exception in C++?

使用python,我可以很容易地得到异常的名称,如下所示。

  • 运行代码,即x=3/0从python获取异常
  • "零分区错误:整数除以或模除以零"告诉我这是零分区错误
  • 修改代码,即Try:X=3/0,除了ZeroDivisionError:做点什么
  • 是否有类似的方法来找到C++的异常名?

    当我运行x=3/0时,编译后的二进制文件只会抛出"浮点异常",与python相比,这是不太有用的。


    虽然您不能轻易地询问异常的名称,但如果异常是从std::exception派生出来的,您可以找到what()中显示的指定原因:

    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
        ...
    }
    catch (const std::exception &exc)
    {
        std::err << exc.what() << std::endl;
    }

    另一方面,除以0并不保证会引发C++异常(我认为MS平台可以做到这一点,但是在Linux上你不会得到它)。


    如果这是一个调试问题,您可以将编译器设置为在遇到异常时中断,这是非常有用的。


    对于大多数例外情况,如果在编译器中设置了rtti选项,则可以执行以下操作:

    1
    2
    3
    4
    catch(std::exception & e)
    {
        cout << typeid(e).name();
    }

    不幸的是,被零除引发的异常不是从std::exception派生的,所以这个技巧不起作用。


    如果您想知道异常类的名称,可以使用rtti。然而,绝大多数C++代码将抛出一个来自STD::ExtExchange的异常。

    但是,您所得到的只是包含在std::exception::what中的异常数据,如果需要更多信息(它包含更多信息),您可以从rtti中获取异常类的名称,并显式地捕获它。