问题标签 [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.

0 投票
1 回答
107 浏览

kotlin - 为什么 kotlin 提供空安全运算符而不提供异常安全运算符?

如果 kotlin 提倡安全代码,例如:

为什么没有类似的异常处理语法,例如使用虚??.运算符:

我没有看到这里的缺点。有什么理由这不是语言的一部分吗?

0 投票
1 回答
75 浏览

c++ - 分配器构造和销毁成员函数是否允许从内部逻辑抛出异常?

我正在编写自己的容器,该容器不需要可移动和可复制的类型。我认为在异常安全方面我可以稍微简化逻辑。但是我注意到分配器constructdestroy成员函数没有关于何时可以和不能抛出异常的措辞。

我很确定我以前读过这些措辞。否则,即使我的类型不可移动,construct当我调整缓冲区大小以增加容量时,仍然可以从用户提供的分配器中抛出异常。这需要复杂的回滚代码来保证我真正想跳过的强大的异常安全性。

是否有一种措辞只允许从调用 ctor/dtor 时抛出异常,或者分配器是否总是需要复杂的机制来维护异常安全?

0 投票
1 回答
62 浏览

c++ - 私有函数成员应该是异常安全的吗?

在编写异常安全代码时,所有私有成员函数是否应该至少保证基本的异常安全?在这种情况下,最佳/最佳做法是什么?备择方案?

例如,假设我有一个Foo带有publicfunction member的类DoSomething,它调用privatefunction member DoSomeOfItDoSomeOfIt可能由于某些我无法影响的功能而失败,并且当它发生时,它可能会使Foo对象处于部分修改状态,这违反了Foo的不变量。所以我可以包装DoSomeOfIt在一个块中并调用块中的try-catch另一个private函数成员来撤消所做的事情。单独地,可能不是异常安全的,但确实如此。那会是异常安全代码吗?(在这种情况下有强有力的保证)UndoThatcatchDoSomeOfItDoSomeOfItUndoThatDoSomething

当然,我可以简单地包含DoSomeOfItUndoThatin的代码DoSomething,但这可能会导致代码膨胀和函数体过长,而分解函数会使任务模块化并可能使代码更具可读性(?)

免责声明:我理解这可能是基于意见的。我不确定这是否会使这篇文章变得糟糕,但我会很感激任何意见或经验,这会导致问题,或者是常见的做法等。

0 投票
1 回答
95 浏览

c++ - std::atomic 怎么样::operator= 为不可变类型实现?

我了解到线程之间进行通信的一种方法是共享一些原子数据结构。例如:

尽管已被删除,但调用赋值运算符Point::operator=(Point const &)似乎没有问题std::atomic<Point>,如下所示:

这个操作如何实现?

我可能会考虑的一种解决方案是placement new在旧对象之上构造一个新对象,但显然它不是异常安全的。还是因为Point可以轻松复制而可以?

0 投票
1 回答
285 浏览

c++ - 复合模式中的异常安全

我使用复合模式来表示设备,我想在关闭它们的电源(调用它们的 dtor)之前关闭它们。我在尝试对设备进行分组时遇到了问题,尤其是关于它们的状态。

在以下情况下我将如何进行:

工作站可能包含多个设备,您需要在停止工作站电力之前安全地关闭所有设备。(在这个比喻中,我很便宜)。还值得注意的是,我永远不会希望任何一个设备自行打开 - 一切都将始终作为一个单元。

当其中一个内部设备不想安全关闭时,问题就出现了——它会抛出异常(例如,计算机的程序阻止它关闭)。

is_on() 在那种状态下应该返回什么?连续的方法调用应该做什么?或者,我可以使用另一种设计模式来更好地表示我的问题吗?

0 投票
2 回答
237 浏览

c++ - Effective Modern C++ 中的这个项目仍然是最新的吗?

有效的现代 C++ 第 146 页:

这是 C++17 之前的不安全调用:

它曾经是不安全的,因为可以在构造函数之后new Widget但之前调用computePriority std::share_ptr,如果computePriority产生异常,动态的allcoat Widget 将被泄露。因此你可以这样做:

现在这将在 shared_ptr 上添加一个复制构造函数操作。所以你也可以这样做:

所以我的问题是,以下代码是否仍然能够在 C++17 中泄漏内存?

我已经阅读了这个这个,但我仍然不确定,我相信std::shared_ptr<Wdiget>(new Widget, cusDel)并且computePriority()都在调用 processWidget 之前排序,但是我认为在获得新创建的对象的所有权之后和之前computePriority()仍然可以抛出异常。newshared_ptr

0 投票
0 回答
275 浏览

rust - 如果 Drop 出现恐慌,我可以(并且应该)做什么?无论如何我可以释放其他资源吗?

我有一个简单的资源,它使用MaybeUninitunsafe出于外部原因:

我想,如果T::drop()惊慌失措,RefMut就会泄漏,毒化它RefCell。我怎样才能防止这种情况发生,这样做会不会是惯用的?该文档指出:

鉴于 apanic!将在展开时调用drop,因此实现中的任何panic!一个drop都可能中止。

但是这个“可能”并没有足够清楚地说明我是否应该期待(并且可以处理)这种情况。

0 投票
0 回答
239 浏览

android - 在 Kotlin 中处理异常的正确方法是什么?

在 Java 中,Android Studio 会为某些函数提供 Unhandled Exception 错误。例如,当我们编写将 String 转换为 Date 变量的代码时,它显示 Unhandled Exception:ParseException & 按 Alt+Insert 会自动添加 try catch 块 & 我们可以在 catch 块中编写异常条件的代码。但是在 Kotlin 中我没有看到这样的警告。在 Kotlin 中是否有其他处理异常的方法?

0 投票
1 回答
122 浏览

c++ - 新操作员的异常安全

这是libstdc++ 中 new 运算符的实现:

谁保证构造函数中的异常会释放分配的内存?

Upd:感谢评论员——实际上我的意思是新表达式的异常安全。

0 投票
1 回答
61 浏览

c++ - 使用自定义比较器,std::map 异常是否安全?

std::map如果自定义比较器在重新平衡期间抛出异常怎么办?显然,它应该记住所有先前的回合并将所有内容恢复到原始状态。这是真的吗?