捕获多个参数

时间:2010-10-23 20:13:07

标签: c++ exception try-catch

首先我在cplusplus.com中找到以下引语:

  

catch格式类似于常规函数,该函数始终至少有一个参数。

但我试过这个:

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

编译器不会抱怨带有大括号和多个参数的throw。但它实际上抱怨了多个参数的捕获,尽管参考文献说的是什么。我糊涂了。 trycatch是否允许这种多样性?如果我想抛出包含多个具有或不具有相同类型的变量的异常,该怎么办呢?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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());
}