2010-10-23 82 views
3

首先,我在cplusplus.com發現以下報價:捕捉與多個參數

美中不足的格式類似於常規的功能總是至少有一個參數。

但我想這:

try 
{ 
    int kk3,k4; 
    kk3=3; 
    k4=2; 
    throw (kk3,"hello"); 
} 
catch (int param) 
{ 
    cout << "int exception"<<param<<endl;  
} 
catch (int param,string s) 
{ 
    cout<<param<<s; 
} 
catch (char param) 
{ 
    cout << "char exception"; 
} 
catch (...) 
{ 
    cout << "default exception"; 
} 

編譯器不抱怨用括號和多個參數拋出。但它實際上抱怨有多個參數,儘管參考文獻說了什麼。我很困惑。 trycatch是否允許這種多重性?如果我想拋出一個包含多個變量的異常(包含或不包含相同類型),該怎麼辦?

+0

上逗號運算符閱讀起來。你不會拋出'(kk3,「hello」)',你拋出''你好'''。 – delnan 2010-10-23 20:15:14

+0

所以它只有一個參數在兩個? – 2010-10-23 20:17:17

回答

10

(kk3,「hello」)是一個逗號表達式。逗號表達式從左到右評估它的所有參數,結果是最右邊的參數。所以在表達

int i = (1,3,4); 

我變爲4

如果你真的想拋出他們兩人(出於某種原因),你可以拋出這樣

throw std::make_pair(kk3, std::string("hello")); 

,趕上這樣的:

catch(std::pair<int, std::string>& exc) 
{ 
} 

而且catch子句具有完全相同的Ë參數

... 

HTH

+0

非常感謝:)這非常有用。 – 2010-10-23 20:23:58

2

除了其他的答案,我會建議你創建自己的異常類,它可以包含多個資料片。它應該最好來自std::exception。如果你制定這個策略,你總是可以用一個catch(std::exception&)來捕獲你的異常(如果你只想釋放一些資源,然後重新拋出異常 - 你不必爲每個異常都有一個gazilion catch處理程序鍵入你扔)。

實施例:

class MyException : public std::exception { 
    int x; 
    const char* y; 

public: 
    MyException(const char* msg, int x_, const char* y_) 
     : std::exception(msg) 
     , x(x_) 
     , y(y_) { 
    } 

    int GetX() const { return x; } 
    const char* GetY() const { return y; } 
}; 

... 

try { 
    throw MyException("Shit just hit the fan...", 1234, "Informational string"); 
} catch(MyException& ex) { 
    LogAndShowMessage(ex.what()); 
    DoSomething(ex.GetX(), ex.GetY()); 
} 
+2

「如果你只想釋放一些資源,然後重新拋出異常,那麼」非常有用「。在這種情況下,你應該只是'catch(...){/ * ... */throw; }'。另外,'std :: exception'沒有帶參數的構造函數。 (儘管我知道VS有一個。) – GManNickG 2010-10-23 20:40:39

+0

catch(...)的問題在於它(至少在Windows平臺上)還會捕獲操作系統在存在訪問不良的情況下觸發的結構化異常,或者您有什麼。當我的一段代碼沒有使程序崩潰時,我感到很驚訝。我有一個圍繞調用鏈的catch(...),它捕獲了空指針訪問。如果進程的狀態處於未知狀態,我有點擔心會發生任何錯誤。 – 2010-10-26 19:19:48