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
中定义的枚举(因为不同的枚举器可能会成为最后一个枚举器变化)。
我写了下面的异常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
中定义的枚举(因为不同的枚举器可能会成为最后一个枚举器变化)。