无法从c ++中的函数中捕获异常

时间:2014-07-22 13:22:09

标签: c++ exception exception-handling

就像标题所说,我无法捕捉到函数抛出的异常。它只是说“在throwin tocccli :: InvalidParametersError *”

的实例后终止调用
try{
  cmd_parameters = parse_cmd(argc, argv);
}
catch (InvalidParametersError e){
  // blablabla
}

抛出异常的函数

std::vector<CmdParam> parse_cmd(int argc, char* argv[]){
for (int i = 1; i < argc; ++i)
{
  if (argv[i][0] == '-')
  {
   //blablala
  }
  else
  {
    if (result.empty())
    {
      throw new InvalidParametersError(
          "First parameter have to be an option (e.g. starts with a dash)");
    }

    result.back().arguments.push_back(argv[i]);
  }
}

return result;
}

该函数位于名为tocccli的命名空间内 我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

请勿使用new中的parse_cmd()关键字:

std::vector<CmdParam> parse_cmd(int argc, char* argv[]){
for (int i = 1; i < argc; ++i)
{
  if (argv[i][0] == '-')
  {
   //blablala
  }
  else
  {
    if (result.empty())
    {
      throw InvalidParametersError(  // <-- No new keyword here
          "First parameter have to be an option (e.g. starts with a dash)");
    }

    result.back().arguments.push_back(argv[i]);
  }
}

return result;
}

通过const引用捕获:

try{
  cmd_parameters = parse_cmd(argc, argv);
}
catch (const InvalidParametersError& e){
  // blablabla
}

答案 1 :(得分:3)

您正在抛出指向InvalidParametersError的指针,并按值捕获。考虑将你的投掷改为:

throw InvalidParametersError("First parameter have to be an option (e.g. starts with a dash)");

正如@pmr所指出的,还要考虑使用const ref

try {
    cmd_parameters = parse_cmd(argc, argv);
} catch (const InvalidParametersError &e) {
    // ....
}

答案 2 :(得分:-2)

只需在catch块中添加&符号,然后在catch块中完成。

catch (InvalidParametersError &e)