【问题标题】:C++ try/catch not catching exceptionC++ try/catch 没有捕捉到异常
【发布时间】:2014-01-25 04:23:45
【问题描述】:

我有以下尝试/捕获:

try
{
    Player newPlayer = Database::newPlayer(atoi(arguments.at(1).c_str()), arguments.at(2));
}
catch (int e)
{
    cout << "Wrong parameters used.\n";
}

我的目标是能够添加一个播放器,如果由于某种原因参数不匹配,例如为 arguments.at(1) 放置一个非整数或没有足够的参数,但如果我这样做,则在 Visual Studio 中然后程序崩溃,Visual Studio 说“未处理的异常,std::out_of_range 在内存位置”。我希望我的程序在发生这种情况时不会崩溃,而只是说“使用了错误的参数”,因为它目前在 catch 语句中。

【问题讨论】:

  • 您收到了int。你知道吗?
  • 要捕获所有内容,请使用catch (...),但不要这样做。
  • 你需要捕获 std::out_of_range 而不是 int
  • 捕获std::out_of_range 类型而不是int
  • 我推荐std::stoi(或者boost::lexical_cast,如果你还没有达到C++11)而不是atoi()atoi() 不会在无效整数上抛出任何东西,只返回一个 0。

标签: c++ visual-studio


【解决方案1】:

您需要捕捉std::out_of_range 而不是int

【讨论】:

    【解决方案2】:

    你需要捕捉 std::out_of_range 而不是 int

    try
    {
        Player newPlayer = Database::newPlayer(atoi(arguments.at(1).c_str()), arguments.at(2));
    }
    catch (std::out_of_range& e)
    {
        cout << "Wrong parameters used.\n";
    }
    

    【讨论】:

      【解决方案3】:

      您需要捕获 std::out_of_range 异常,例如:

      try
      {
         //your throwing code
      }
      catch (std::out_of_range &e)
      {
          cout << "Wrong parameters used.\n";
      }
      

      还要注意使用引用(& 用法)进行捕获,而不是像使用 int 那样按值捕获,以避免对象切片和冗余副本的任何问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 2020-01-08
        • 2016-01-26
        相关资源
        最近更新 更多