C++的错误和异常处理分析

C++的错误和异常处理分析,第1张

C++的错误和异常处理分析,第2张

何时使用异常?

一个简单的答案是:“当异常的语义和性能需求合适时。”

一个经常提到的方法是问自己,“这是一个例外(或意外)的情况吗?”这种方法看起来很吸引人,但通常只会导致错误的答案。对一个人来说“不正常”的,对另一个人来说就是“正常”的:当你真正仔细考虑这句话的时候,你会发现你无法做出区分,这句话对你一点帮助都没有。毕竟,如果你检查了某个错误条件,就意味着你认为它会发生,否则你的检查除了垃圾代码什么都不是。

更合适的问题是:“这里需要栈扩展吗?”由于异常处理实际上几乎总是比正常的进程代码慢,您还应该问自己,“您能负担得起这里的堆栈扩展成本吗?”例如,它需要很长时间来进行计算,并定期检测用户是否按下了取消键。抛出异常可以优雅地取消操作。另一方面,在这个计算的内部循环中抛出和捕获处理异常可能是不合适的,这可能会导致严重的性能下降。前面的内容包含了这样一个原则,对于时间关键的代码,抛出异常是一个“异常”而不是一个例程。

如何设计异常类?

1.从std::exception派生异常类。除了一些非常罕见的情况,如无法负担所需功能的成本。使用std::exception作为异常基类是合理的。当它被广泛使用时,它将允许程序员在不使用catch(...).有关catch的更多信息(...),请看下面。

2.使用虚拟继承。这种深刻的见解来自安德鲁·克尼格。当抛出的异常是从多个基类派生的,并且这些基类有一些共同点时,catch点就会遇到二义性。从异常基类的虚拟继承可以防止这种模糊性:

# include
struct my _ ex C1:STD::exception { char const * what()const throw();};
struct my _ ex C2:STD::exception { char const * what()const throw();};
struct your_exc3 : my_exc1,my _ ex C2 { };

int main()
{
try { throw your_exc3(); }
catch(std::exception const& e) {}
catch(...) { std::cout

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++的错误和异常处理分析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情