问题标签 [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 回答
197 浏览

c++ - 函数调用中的异常安全

调用f()异常安全吗?

换句话说,auto_new()如果这两个函数是内联的,那么在第一个和第二个函数调用的原子性方面有什么区别吗?

0 投票
1 回答
868 浏览

c++ - InitOnceExecuteOnce 异常安全

我在 InitOnceExecuteOnce WinAPI 函数上有一个异常安全问题。每当从回调函数抛出异常时,就会发生死锁。回调返回布尔标志,告诉调用者数据是否初始化成功,但如果我返回 false 我将无法重新抛出异常,这不好。我试着用这种方式解决了这个问题。

每当我从函数中捕获异常时,我都会再次初始化结构并重新抛出异常,因此其他线程会发现未初始化的数据,因为标志处于初始状态。但是,它有时也会死锁,可能是因为其他线程在第一个线程捕获异常并再次初始化标志之前开始等待同步对象。这个问题有什么解决办法吗?

提前致谢。

0 投票
2 回答
503 浏览

c++ - 异常安全示例保证正确吗?

我讨论了异常安全保证,并设计了一个我认为提供强保证的示例:

只是一个简单的(C ++ 0x)示例如何使用它:

假设LT不改变元素,但它可能会抛出。假设代码提供的内容是否正确

  • 异常安全保证
  • 异常中性_LT
0 投票
6 回答
734 浏览

java - 你怎么知道一个方法可以抛出的所有异常

有没有办法获得有关 Java 标准类的异常安全方面的一些详细信息?主要使用 C++ 和 C#,我对 Java 异常规范感到困惑,所以我需要了解处理异常的正确方法。

更具体地说,让我们考虑ServerSocket. 一旦构建了它的对象,它就开始监听传入的连接。然后,您应该使用accept()接受连接(如果有人尝试连接)。

如果您之前使用 配置了服务器套接字,则会setSoTimeout()发生更改,因为在指定的时间段内没有人尝试连接。没关系,服务器套接字仍然可用,所以你只需再次调用。accept()SocketTimeoutExceptionaccept()

SocketTimeoutException并不是唯一accept()可能抛出的东西。所有其他例外是​​什么意思?accept()如果我用 2 个 catch 子句包装调用: for SocketTimeoutExceptionand ,在进入子句后我IOException还能安全地使用相关实例吗?ServerSocketIOException

我非常感谢 Java 范围和特定于 ServerSocket 的答案。

0 投票
3 回答
322 浏览

c++ - 有一个抛出交换成员实现可以吗?

编写类时的一般准则(使用复制和交换习惯用法)是提供一个非抛出交换成员函数。(Effective C++,第 3 版,第 25 条和其他资源)

但是,如果因为我的班级使用不提供交换操作的第 3 方班级成员而无法提供 nothrow 保证怎么办?

CString 交换不能不抛出,因此交换失败的可能性很小。

注意:对于罕见的第 3 方课程,可以选择使用智能 ptr (pimpl),但是--

注意:CString 是一个很好的例子,因为他头脑正常(?)的人不会开始通过 pimpl(智能 ptr)持有概念上简单且无处不在的类的所有成员,例如 CString,因为这看起来真的很可怕——另一方面,没有(短期到中期)机会来修改 CString 以允许完全不抛出交换。

那么,如果你不能帮助它,是否可以有一个潜在的抛出交换成员函数?(或者你知道解决这个难题的方法吗?)

编辑:并且:如果不是强保证,是否可以将抛出交换成员与复制和交换习语一起使用以提供基本保证?

0 投票
6 回答
4017 浏览

c# - 确保对象不为空

如何确保某个类的某个实例永远不会为空?有人告诉我使用 Debug.Assert() 但这样做,我只会确保代码在调试模式下工作,而我也想确保发布时的 is-never-null 条件。

例如,过去我写的代码如下:

但是,如果 instance1 为空,则会引发异常。我想避免在将来犯这样的错误并产生这样的异常。

谢谢,


请参阅下面说明问题的具体示例:

我有一种方法可以根据服务器的响应对用户进行身份验证。方法是这样的:

要调用此方法,我使用

我也有这个属性,等等

发生的事情是 _authenticationResult 曾经为 null,并且属性 AuthResult 在尝试“null.auth”时抛出了一个 nullref。我如何确保(可能在 CheckUser() 方法中)它永远不会返回 null。

当我调试应用程序时,它从未发生过。但是在生产中,当服务器超时时,该方法有时会返回 null。

谢谢,

0 投票
6 回答
3462 浏览

java - 同步关键字异常安全吗?

可能重复:
在同步子句中抛出异常的副作用?

我想知道是否synchronized是异常安全的?比如说,在同步块中发生了未捕获的异常,锁会被释放吗?

0 投票
2 回答
1891 浏览

objective-c - Objective-C 模式中的 RAII?

我发现自己编写这样的代码来实现异常安全代码:

在 Objective-C 中是否有其他更简洁的模式可以遵循?

0 投票
2 回答
508 浏览

c++ - 内存领域的异常安全

我正在编写一个简单的内存区域分配器,并面临一个异常安全的小问题。这种情况是当您分配一个本身调用分配器的对象时。内存池的目标是一次分配一堆对象,然后在池被销毁时将它们全部删除。

但是当它被多次使用时,这变得相当讨厌。如果内部分配被清理,那么它可以在之后使用 - 不错的假设,因为池的定义是在其生命周期结束之前永远不会删除对象。考虑:

但是如果内部分配清理,外部分配也无法清理,因为内存区域像硬件堆栈一样线性分配它们,所以我泄漏内存。所以要么我通过提前销毁一个对象来违反我的语义,要么我泄漏内存。

有关如何解决此问题的任何建议?

0 投票
1 回答
441 浏览

c++ - std::bad_alloc 之后的 std::vector 状态

我正在尝试查找在线参考,以查看几个 std 容器的异常安全性。

在 的情况下 std::vector,它是否保持 push_back 调用之前的状态?我假设向量的所有对象仍然有效(没有调用析构函数)。std::vectorpush_back 抛出异常后提供什么保证std::bad_alloc