首页 文章

我如何知道C中的异常名称?

提问于
浏览
2

使用Python,我可以轻松地获得异常的名称,如下所示 .

  • 运行代码,即x = 3/0以从python获取异常

  • "ZeroDivisionError: integer division or modulo by zero"告诉我这是ZeroDivisionError

  • 修改代码,即尝试:x = 3/0除了ZeroDivisionError:做点什么

有没有类似的方法用C找到异常名称?

当我运行x = 3/0时,编译后的二进制文件只会抛出“浮点异常”,与python相比,它没那么有用 .

4 回答

  • 1

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

    try
    {
        ...
    }
    catch (const std::exception &exc)
    {
        std::err << exc.what() << std::endl;
    }
    

    除此之外,除以0并不能保证引发C异常(我认为MS平台可能会这样做,但你不会在Linux上得到它) .

  • 4

    如果您想知道异常类的名称,可以使用RTTI . 但是,绝大多数C代码都会抛出从std :: exception派生的异常 .

    但是,你得到的只是std :: exception :: what中包含的异常数据,你可以从RTTI获取异常类的名称,并在需要更多信息时明确捕获它(并且它包含更多信息) .

  • 1

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

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

    不幸的是,除以零抛出的异常并不是从std :: exception派生的,所以这个技巧不起作用 .

  • 1

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

相关问题