gpt4 book ai didi

c++ - 为什么要在枚举上抛出一个类?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:33 25 4
gpt4 key购买 nike

只是想知道,为什么把一个类放在一个枚举上会更好

当然扔类是更多的开销?

例如

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com