代码之家  ›  专栏  ›  技术社区  ›  Ismail Marmoush

多参数捕获

  •  3
  • Ismail Marmoush  · 技术社区  · 14 年前

    我第一次发现 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";
    }
    

    try catch 是否允许这种多样性?如果我想抛出一个异常,该异常包含多个具有或不具有相同类型的变量。

    2 回复  |  直到 10 年前
        1
  •  10
  •   Armen Tsirunyan    14 年前

    (kk3,“hello”)是一个逗号表达式。逗号表达式从左到右对其所有参数求值,结果是最右边的参数。所以在表达式中

    int i = (1,3,4); 
    

    我四岁了。

    如果你真的想把他们两个都扔了(出于某种原因),你可以这样扔

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

    像这样抓住:

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

    以及 catch子句只有一个参数

    ...
    

    高温高压

        2
  •  2
  •   Jörgen Sigvardsson    14 年前

    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());
    }