这篇文章主要介绍“C++不能抛出异常怎么解决”,在日常操作中,相信很多人在C++不能抛出异常怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++不能抛出异常怎么解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
E.25:如果不能抛出异常,模仿RAII方式进行资源管理
即使不和异常一起使用,RAII通常是最好的,最系统化的处理资源的方式。
Note(注意)
使用异常的错误处理是C++中完全、系统化处理非局部错误的唯一方式。通常,非侵入式发出错误信号以便构造一个对象需要使用异常。以无法忽视的方式发出错误信号需要异常。如果你无法使用异常,尽你所能模拟它。
很多关于异常的大量恐惧都是被误导的。当在没有被指针或复杂的控制结构搞乱的代码环境中使用异常时,异常处理几乎总是可以接受的(无论是时间还是空间维度),几乎总是可以带来更好的代码。当然,想象一个异常处理机制的良好实现,它不存在于任何系统。还是存在不属于上述问题,但由于其他原因而不能使用异常的情况。某些硬实时系统就是例子之一:一个操作必须在固定时间内完成并得到正确或错误的结果。如果没有适当的时间评价工具,异常很难满足这个要求。这样的系统(例如飞行控制系统)通常也会禁止使用动态(堆)内存。
因此,关于错误处理,主要的准则是“使用异常和RAII”。这个部分内容处理以下情况:要么你无法获得异常的高效实现,要么你的代码是老鼠窝一样的旧代码(例如,大量的指针,病态定义的所有权,大量的基于测试错误的非系统化错误处理),这时无法引入简单和系统化的异常处理。在谴责异常或抱怨异常的成本过高之前,考虑使用错误代码时的成本和复杂度。如果你担心性能,进行测量(而不是无根据的怀疑,译者注)。
Example(示例)
假设你想编写如下代码:
void func(zstring arg)
{
Gadget g {arg};
// ...
}
如果gadget无法正确构建,func会因为异常退出。如果你无法抛出异常,我们可以通过给Gadget增加一个valid成员函数来模拟RAII风格的资源管理。
error_indicator func(zstring arg)
{
Gadget g {arg};
if (!g.valid()) return gadget_construction_error;
// ...
return 0; // zero indicates "good"
}
这里的问题当然是调用者必须记得检查返回值。
Enforcement(实施建议)
可能(仅仅)适用这个想法的特定版本:例如,在资源句柄构建之后系统化检查valid()。
到此,关于“C++不能抛出异常怎么解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。