2014-07-22 30 views
3

就像標題所說,我無法捕獲函數拋出的異常。它只是說無法從C++中的某個函數中捕獲異常

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

拋出異常的函數「肆意tocccli的實例:: InvalidParametersError *終止後,被稱爲」

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 我缺少的東西命名空間裏?

回答

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; 
} 

常量參考捕捉:

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

它的工作!但爲什麼?新的X()和X()之間有什麼區別? – makanbeling

+0

想想一個名爲catch的函數(它不是,但只是忍受着我)。當用X()創建X時,它可以傳遞給catch(X),catch(X&)或catch(const X&)。當使用新的X()創建X時,需要catch來處理指向X的指針,如catch(X *)或catch(const X *)。 當然,用new動態創建一個異常也會引入如何釋放內存的問題。您必須在異常處理程序中刪除X *,這絕對是非規範的。通常情況下,異常會在堆棧中創建並通過引用來捕獲。 – pzed

3

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

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

以及由@pmr指出的那樣,還考慮通過常量裁判

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

並且還考慮在需要多態異常的情況下通過引用趕上。 – pmr

-2

只需在catch塊中完成的錯誤前添加&符號即可。

catch (InvalidParametersError &e)