问题标签 [exception-safety]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 异常安全偏执狂:多少算太多?
强大的异常安全保证表明,如果发生异常,操作不会改变任何程序状态。实现异常安全的复制分配的一种优雅方式是复制和交换习语。
我的问题是:
对变异非原始类型的类的每个变异操作使用复制和交换会不会过大?
性能真的是强异常安全的公平交易吗?
例如:
c++ - 我应该 clear() 容器作为参数传入,还是换入一个新对象?
我正在讨论如何正确处理容器作为参数。
我们有一个接受容器参数的函数,并希望返回仅填充了函数放入其中的容器:
在讨论的一方面,有人说我们应该bars.clear()
先运行该函数。
例如:
我自己的偏好是尽可能接近强异常保证,这意味着制作一个本地容器,填充它并在返回之前进行交换,否则保持bars
不变。
例如:
第一个例子是“经典”方法;在做任何事情之前清除你的参数并从那里开始。
对我来说,第二种方法设置了强大的异常保证(假设函数所做的任何事情都不能改变内部状态),并且避免了 clear() 调用。
选择一种方法而不是另一种方法有什么优点或缺点吗?
请注意,对于此功能,不需要强大的异常保证;如果函数在参数中没有失败,或者在它到达异常处理程序时,它所做的任何事情都会很重要。
c++ - 最简单最整洁的c++11 ScopeGuard
我正在尝试编写一个基于 Alexandrescu 概念但使用 c++11 习语的简单 ScopeGuard。
这是用法:
由于我的版本比那里的大多数示例(如 Boost ScopeExit)短得多,我想知道我遗漏了哪些专业。希望我在这里处于 80/20 的场景中(我得到了 80% 的整洁度和 20% 的代码行),但我不禁想知道我是否遗漏了一些重要的东西,或者是否有一些缺点值得提到这个版本的 ScopeGuard 成语
谢谢!
编辑我注意到 makeScopeGuard 的一个非常重要的问题,它在构造函数中采用了 adquire lambda。如果 adquire lambda 抛出,则永远不会调用 release lambda,因为范围保护从未完全构造。在许多情况下,这是所需的行为,但我觉得有时也需要一个在抛出发生时调用回滚的版本:
所以为了完整起见,我想把完整的代码放在这里,包括测试:
java - Java 异常安全可以变得不那么难看吗?
给定以下代码:我们需要锁定模型,然后启动一个事务(这可能会引发异常,因此我们必须确保释放锁),然后执行类似于获取数据库连接的操作(这可能会引发异常),然后做一些可能引发需要还原事务的异常的事情。这是 Java 6,所以我们没有可用的 Java 7 好东西。
可以将其重写为更具可读性和更少冗长吗?
只是为了好玩:当您看到以下内容时,您会怎么做?
java - 异常规范,有用还是没用?
第一个免责声明:这不是为了引发“语言战争”。我的报告真的需要这个(关于这个主题的澄清),我只想有有效和扎实的论据。
好的,问题来了:
在 C++ 中,异常规范已从 C++11 标准中删除,因为它被认为弊大于利。
另一方面,在 Java 中,异常规范被认为是好的和有用的东西。
这两个概念(具有异常规范的目的)在这两种语言中是否不同,这就是为什么这两个社区对它们的看法不同,或者这些概念是相似/相同的?
哪一个?异常规范是好事还是坏事?或者它在 Java 中是好的,因为(在这里我想看看一些原因)而在 C++ 中是不好的,因为(原因在这里)。
感谢任何提供建设性帮助的人。
c++ - 关于 swap() 操作的异常安全——这有什么问题?
我一直在阅读该swap()
操作,例如:
当我们处理异常安全时是有问题的。
它有什么问题?此外,我们该如何解决呢?
c++ - “检查自我分配”有什么问题,它是什么意思?
在 Herb Sutter 的著作Exceptional C++ (1999)中,他在第 10 项的解决方案中有一句话:
“异常不安全”和“糟糕的设计”齐头并进。如果一段代码不是异常安全的,那通常没关系,可以简单地修复。但是,如果一段代码由于其底层设计而不能成为异常安全的,那几乎总是表明其设计不佳。
示例 1:具有两种不同职责的函数很难使异常安全。
示例 2:以必须检查自赋值的方式编写的复制赋值运算符可能也不是强异常安全的
他所说的“检查自我分配”是什么意思?
[询问]
Dave 和 AndreyT 准确地向我们展示了“检查自我分配”的含义。那挺好的。但问题还没有结束。为什么“检查自我分配”会损害“异常安全”(根据 Hurb Sutter 的说法)?如果调用者尝试进行自分配,则该“检查”就像没有发生分配一样工作。真的很痛吗?
[备忘录 1] 在 Herb 书中后面的第 38 项Object Identity中,他解释了自我分配。