2010-10-23 100 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