多参数捕获

4

首先我在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不会报错,但是它实际上会抱怨有多个参数的catch,尽管参考文献中并没有这样说明。我感到困惑了。 trycatch是否允许这种复杂性?如果我想抛出一个包含一个或多个变量(具有相同类型或不同类型)的异常,该怎么办?

阅读逗号运算符。你不会抛出(kk3, "hello"),你会抛出"hello" - user395760
所以这两个都只有一个参数? - Ismail Marmoush
2个回答

12

(kk3, "hello")是一个逗号表达式。逗号表达式从左到右评估其所有参数,并且结果为最右边的参数。因此在这个表达式中

int i = (1,3,4); 

i变成了4。

如果您真的想要抛弃它们两个(出于某种原因),您可以像这样抛出

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

并且像这样捕获异常:

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

而且一个catch子句只能有一个参数或者

...

希望对你有所帮助


2
除了其他答案之外,我建议你创建自己的异常类,可以包含多个信息。最好从std::exception派生。如果你把这个作为策略,你可以始终使用单个catch(std::exception&)捕获你的异常(如果你只想释放一些资源,然后重新抛出异常-你不必为每个异常类型都有无数个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
catch(...) 的问题在于它(至少在 Windows 平台上)也会捕获由操作系统触发的结构化异常,例如出现了错误的内存访问等。当我的代码出现问题时,我很惊讶它没有导致程序崩溃。因为我在调用链周围加了 catch(...),它捕获了 NULL 指针访问。如果进程状态未知,我有点担心对任何语句进行修改。 - Jörgen Sigvardsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接