【问题标题】:How to print exception message in C++ with catch(...) {..}如何使用 catch(...) {..} 在 C++ 中打印异常消息
【发布时间】:2021-08-09 10:52:35
【问题描述】:

这是示例代码

int main()
{
    string S;
    getline(cin, S);
    try {
        int val = stoi(S);
    } catch(...) {
       // cout << //exception message ; I want to print the exception message. 
    }
    return 0;
}

在这种情况下是否可以打印异常消息?该消息将显示引发了什么样的异常。我正在尝试这个,因为 stoi() 可以抛出多个异常,我想捕获所有异常并打印抛出的异常类型,而不是为每个异常类型使用单独的 catch 块

【问题讨论】:

    标签: c++ exception


    【解决方案1】:

    所有 C++ 库异常都继承自 std::exception

    所以最简单的做法是捕获对它的引用:

    catch (const std::exception &e)
    {
        std::cout << "Caught " << e.what(); << std::endl;
    }
    

    这将捕获stoi 抛出的所有异常。

    【讨论】:

    • 我试过这个。似乎当抛出异常时,唯一的输出是 stoi input string: $#%$sto;' output: Caught Exception: stoi 。这会很好。但我想它不能更具体,除非我在 catch 中使用确切的异常类型
    • what() 的消息是实现定义的,取决于编译器。如果您只需要针对一两个特定异常的自定义消息,则可以使用dynamic_cast 来检查它们。
    【解决方案2】:

    你根本做不到。

    使用catch(...) 捕获有两个属性。

    1. 它可以捕捉任何抛出的东西。
    2. 您无权访问已捕获的任何内容。

    这意味着您不能在捕获的对象上使用.what(),因为您无权访问它。

    如果你有保证std::exception会被抛出,那么你可以简单地捕获std::exception const&amp;

    catch(std::exception const& e){
        std::cout<<"Exception: "<<e.what()<<std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-29
      • 2023-03-08
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2013-04-30
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多