gpt4 book ai didi

c++ - 几个 catch block 还是一个带有 dynamic_cast 的 block ?

转载 作者:太空狗 更新时间:2023-10-29 23:48:24 28 4
gpt4 key购买 nike

我们有一个异常类的层次结构 - 有一个 GenericException 类和许多从它派生的类。 GenericException 是多态的 - 它有一个虚拟析构函数。

其中一个派生类是 FileException 抛出以指示在处理文件系统对象时出现错误。 FileException 具有 GetErrorCode() 方法,该方法返回指示实际出错的代码。

层次结构已经存在,我无法更改它,所以这是不可能的。

异常是从我们无法控制的代码中抛出的,它们总是用 new 关键字抛出,所以我们只能通过指针捕获它们——这也是不可能的。

现在我遇到这样一种情况,一组语句可以生成一个异常,该异常肯定是从 GenericException 派生的。如果它是 FileException 并且 错误情况的类型是“找不到文件”,我什么都不做,否则我想显示一条错误消息,然后我考虑无论如何都会处理异常。

我有两个选择 - 要么:

} catch( GenericException* e ) {
FileException* fileException = dynamic_cast<FileException*>( e );
if( fileException == 0 || fileException->GetErrorCode() != FileNotFound ) {
ShowMessage( e );
}
delete e;
}

或者这个:

} catch( FileException* e ) {
if( fileException->GetErrorCode() != FileNotFound ) {
ShowMessage( e );
}
delete e;
} catch( GenericException* e ) {
ShowMessage( e );
delete e;
}

我更喜欢第一个,因为它减少了代码重复。但我听说,由于 C++ 允许选择性捕获 block (如第二个选项),我不应该使用 dynamic_cast - 选择性捕获 block 不需要它。

哪个选项更好?此处不是第一个选项的原因可能是什么?

最佳答案

你永远不应该扔指针。始终抛出值并通过 const 捕获引用。几乎不可能正确地清除动态分配的异常对象。

为了回答您的问题,我个人不相信有复杂的异常层次结构。如果您需要对异常执行条件处理,则需要在离抛出点更近的地方处理异常,在那里您拥有比当前似乎正在做的更多的上下文信息。

关于c++ - 几个 catch block 还是一个带有 dynamic_cast 的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980149/

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