C++ 异常处理和枚举作用域

C++ Exception Handling and Enum Scoping

我写了下面的异常class:

class generic_exception : public std::exception
{

  public:

    generic_exception( std::string where, int err_code , bool fatal ) 
    : where_(where) , errcode_(err_code) ,fatal_(fatal) {}

      inline int get_errcode()
      {
        return errcode_;
      }

      inline bool is_fatal()
      {
        return (fatal_ == true ? true : false);
      }

      inline std::string get_where()
      {
        return where_;
      }

     ~generic_exception() throw () { }

  private:

    std::string where_;
    int errcode_;
    bool fatal_;

};

我用它来处理错误,而没有为每种类型的错误创建一个异常 class。所有 err_code 值都是用作错误代码的基本枚举值(所有在单个 classes 中定义的需要错误检查的值)。

一些例子class:

class A
{
  enum one{a,b,c}
};

class B
{
  enum two{d,e,f}
};

尝试捕获示例:

try
    {
      //something
      throw generic_exception("where" , one::a , true );
      throw generic_exception("where" , two::a , true );

    }
    catch( generic_exception e)
    {
      switch(e.get_errcode())
      {
        case one::a:
          break;
        case two::b:
          break;
      }
    }
  }

当来自不同枚举但相同整数值的两个值出现在同一个 switch case 语句中时,我遇到了问题。 当这种情况发生时,就像上面的例子一样,编译器打印一个 "error: duplicate case value"。我想这个错误的原因是 归因于两个家庭的整数'nature'。 我怎么解决这个问题?我是否必须将此 "generic exception scheme " 更改为多态方案(单一错误类型的一个例外 class)?

您可以:

1) 使用全局枚举:

enum ErrorCode
{
    A_one,
    A_two,
    A_three,
    //...

    B_one,
    B_two,
    //...
};

2) 或者使用枚举器计数:

class A
{
public:
    enum
    {
        Err_one,
        Err_two,
        Err_three,
        //...

        Last_error
    };
};

class B
{
public:
    enum
    {
        Err_one = A::Last_error,
        Err_two,
        Err_three,
        //...

        Last_error
    };
};

使用 Last_error 的技巧很好,因为您可以通过这种方式定义许多枚举,如果您 add/remove 一些枚举器,其中 none 将需要更新。如果你想避免定义额外的枚举器,你应该将前一个枚举中最后一个枚举器的值分配给第一个枚举器值,增加 1.

但请注意,在这种情况下,即使 A 中定义的枚举发生微小变化,也可能需要更新 class B 中定义的枚举(因为不同的枚举器可能会成为最后一个枚举器变化)。