专栏首页C++核心准则原文翻译C++核心准则E.25:如果不能抛出异常,模仿RAII方式进行资源管理

C++核心准则E.25:如果不能抛出异常,模仿RAII方式进行资源管理

月季

E.25: If you can't throw exceptions, simulate RAII for resource management

E.25:如果不能抛出异常,模仿RAII方式进行资源管理

Reason(原因)

Even without exceptions, RAII is usually the best and most systematic way of dealing with resources.

即使不和异常一起使用,RAII通常是最好的,最系统化的处理资源的方式。

Note(注意)

Error handling using exceptions is the only complete and systematic way of handling non-local errors in C++. In particular, non-intrusively signaling failure to construct an object requires an exception. Signaling errors in a way that cannot be ignored requires exceptions. If you can't use exceptions, simulate their use as best you can.

使用异常的错误处理是C++中完全、系统化处理非局部错误的唯一方式。通常,非侵入式发出错误信号以便构造一个对象需要使用异常。以无法忽视的方式发出错误信号需要异常。如果你无法使用异常,尽你所能模拟它。

A lot of fear of exceptions is misguided. When used for exceptional circumstances in code that is not littered with pointers and complicated control structures, exception handling is almost always affordable (in time and space) and almost always leads to better code. This, of course, assumes a good implementation of the exception handling mechanisms, which is not available on all systems. There are also cases where the problems above do not apply, but exceptions cannot be used for other reasons. Some hard-real-time systems are an example: An operation has to be completed within a fixed time with an error or a correct answer. In the absence of appropriate time estimation tools, this is hard to guarantee for exceptions. Such systems (e.g. flight control software) typically also ban the use of dynamic (heap) memory.

很多关于异常的大量恐惧都是被误导的。当在没有被指针或复杂的控制结构搞乱的代码环境中使用异常时,异常处理几乎总是可以接受的(无论是时间还是空间维度),几乎总是可以带来更好的代码。当然,想象一个异常处理机制的良好实现,它不存在于任何系统。还是存在不属于上述问题,但由于其他原因而不能使用异常的情况。某些硬实时系统就是例子之一:一个操作必须在固定时间内完成并得到正确或错误的结果。如果没有适当的时间评价工具,异常很难满足这个要求。这样的系统(例如飞行控制系统)通常也会禁止使用动态(堆)内存。

So, the primary guideline for error handling is "use exceptions and RAII." This section deals with the cases where you either do not have an efficient implementation of exceptions, or have such a rat's nest of old-style code (e.g., lots of pointers, ill-defined ownership, and lots of unsystematic error handling based on tests of error codes) that it is infeasible to introduce simple and systematic exception handling.

Before condemning exceptions or complaining too much about their cost, consider examples of the use of error codes. Consider the cost and complexity of the use of error codes. If performance is your worry, measure.

因此,关于错误处理,主要的准则是“使用异常和RAII”。这个部分内容处理以下情况:要么你无法获得异常的高效实现,要么你的代码是老鼠窝一样的旧代码(例如,大量的指针,病态定义的所有权,大量的基于测试错误的非系统化错误处理),这时无法引入简单和系统化的异常处理。在谴责异常或抱怨异常的成本过高之前,考虑使用错误代码时的成本和复杂度。如果你担心性能,进行测量(而不是无根据的怀疑,译者注)。

Example(示例)

Assume you wanted to write

假设你想编写如下代码:

void func(zstring arg)
{
    Gadget g {arg};
    // ...
}

If the gadget isn't correctly constructed, func exits with an exception. If we cannot throw an exception, we can simulate this RAII style of resource handling by adding a valid() member function to Gadget:

如果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"
}

The problem is of course that the caller now has to remember to test the return value.

这里的问题当然是调用者必须记得检查返回值。

See also: Discussion

参见:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-???

Enforcement(实施建议)

Possible (only) for specific versions of this idea: e.g., test for systematic test of valid() after resource handle construction

可能(仅仅)适用这个想法的特定版本:例如,在资源句柄构建之后系统化检查valid()。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#e25-if-you-cant-throw-exceptions-simulate-raii-for-resource-management

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.43: 避免在表达式中使用无定义的运算次序

    You have no idea what such code does. Portability. Even if it does something sen...

    面向对象思考
  • C++核心准则Per.7:设计要为优化做准备

    Because we often need to optimize the initial design. Because a design that igno...

    面向对象思考
  • C++核心准则E.6:使用RAII防止资源泄露

    Leaks are typically unacceptable. Manual resource release is error-prone. RAII (...

    面向对象思考
  • 使用深度神经网络对超深电磁测井进行建模(CS.CE;CS.LG)

    现代的地理导航技术在很大程度上依赖于对深部电磁(EM)测量结果的实时解释。该工作提出了一种深度神经网络(DNN)模型,该模型经过训练,能够再现完整的超深度实时电...

    用户7236395
  • 谷歌发表的史上最强NLP模型BERT的官方代码和预训练模型可以下载了

    TensorFlow code and pre-trained models for BERT https://arxiv.org/abs/1810.04805

    AINLP
  • 32类计算机与数学领域最为重要的算法

    导读: 奥地利符号计算研究所的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科...

    钱塘数据
  • 增值税:多层关键值商店的渐近成本分析(CS.DC)

    在过去的几年中,键值(KV)商店设计的数量不断增加,每种设计都针对不同的需求进行了优化。此外,随着存储技术的进步,KV商店的设计空间变得更加复杂。最近的KV商店...

    蔡小雪7100294
  • 通过将语义和统计技术结合来动态丰富网络主体(cs.CL)

    翻译:伴随着语义网技术的发展,开始更多使用本体来存储和提取覆盖多个领域的信息。但是,很少有本体能够处理得当不断更新的语义信息日益增长的需求,亦或是针对专业领域用...

    Donuts_choco
  • 【LeetCode】724. Find Pivot Index

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D

    饶文津

扫码关注云+社区

领取腾讯云代金券