簡體   English   中英

無法從c ++中的函數中捕獲異常

[英]can't catch an exception from a function in c++

就像標題所說,我無法捕捉到函數拋出的異常。 它只是說“在拋出一個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的命名空間內我是否遺漏了什么?

不要在parse_cmd()使用new關鍵字:

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
}

您正在拋出一個指向InvalidParametersError的指針,並按值捕獲。 考慮將你的投擲改為:

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

正如@pmr所指出的,還要考慮使用const ref

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

只需在catch塊中添加&符號,然后在catch塊中完成。

catch (InvalidParametersError &e)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM