首先我在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。但它实际上抱怨了多个参数的捕获,尽管参考文献说的是什么。我糊涂了。 try
和catch
是否允许这种多样性?如果我想抛出包含多个具有或不具有相同类型的变量的异常,该怎么办呢?
答案 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());
}