作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
只是想知道,为什么把一个类放在一个枚举上会更好
当然扔类是更多的开销?
例如
enum MyException
{
except_a,
except_b,
except_c
}
void function f(){
throw except_a;
}
int main(int arc, char* argv[]){
try{
} catch (MyException e){
switch(e){
except_a: break;
except_b: break;
except_c: break;
}
}
return 0;
}
除了开销。我还需要为每个可能覆盖 std::exception 或其他东西的类声明一个类。更多代码、更大二进制文件……有什么好处?
最佳答案
以下两个catch
block 哪个更容易理解:
try {
do_something();
}
catch (const int&) {
// WTF did I catch?
}
catch (const std::out_of_range&) {
// Oh, something was out of range!
}
异常类的名称应该告诉您异常被抛出的原因; int
不会告诉您任何信息,您只知道您捕获了一个 int
,无论那是什么意思。
考虑使用枚举而不是整数的更新示例,以下哪项更清楚:
try{
do_something();
}
// (1) Catch an enum:
catch (MyException e) {
switch(e) {
except_a: break;
except_b: break;
except_c: break;
default: throw; // Don't forget, you have to throw any exceptions
// that you caught but don't actually want to catch!
}
}
// (2) Catch specific exceptions
catch (const ExceptionA&) { }
catch (const ExceptionB&) { }
catch (const ExceptionC&) { }
完全没有理由更喜欢第一种形式:它没有性能优势,而且代码不太清晰且更容易出错。在你的例子中,如果你没有处理它,你会忘记重新抛出异常,所以如果有人后来向 MyException
枚举添加了一个 except_d
异常,你会在不知不觉中捕获了。
至于你的“开销”问题,这取决于,但可能不是。抛出异常应该(相对)罕见,如果您有一个性能非常重要的紧密循环,您无论如何都不会使用异常。
对异常使用类层次结构的好处是它们允许您编写更清晰的代码,就像使用非本地控制流(异常)而不是其他方法(如错误代码返回值)的好处允许您编写更清晰的代码一样(至少当你正确使用异常时)。
关于c++ - 为什么要在枚举上抛出一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048691/
我是一名优秀的程序员,十分优秀!