问题标签 [exception-safe]
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.
terminology - 如果在执行过程中抛出异常,如何描述没有副作用的方法?
我只是不记得用于此属性和其他相关属性的术语。
编辑 - 也许这样的概念不存在,但我记得在 Effective C++(或 More Effective C++)中读过一些东西,他主张使用交换在函数中最后提交更改,因为向量交换函数保证不会抛出异常。
c# - .Net HtmlTextWriter 的异常安全/处理?
我正在使用 .NetHtmlTextWriter
生成 HTML。
在此示例中,如果在 期间触发了错误异常myObject.GenerateHtml()
,我将生成一个不错的错误 html,但它前面会带有一个span
从不关闭的开始标记。
我可以像这样重构它
现在我的跨度没有打开,直到我完成了艰苦的工作,但这对我来说看起来很尴尬。有没有办法用 HtmlWriter 回滚?即使我不得不投入大量使用块。
我目前在 .Net 2.0 中工作,但可以讨论 3.5 中的解决方案。
c++ - 这是一个很好的 std::auto_ptr<> 用例吗?
请假设我有一个接受指针作为参数的函数。此函数可以抛出异常,因为它用于std::vector<>::push_back()
管理此指针的生命周期。如果我这样声明:
并这样称呼它:
如果它抛出一个将指针推入的异常std::vector<>
,我实际上有内存泄漏,不是吗?
会像这样声明函数:
解决我的问题?
我希望它首先std::auto_ptr
在堆栈上分配 (我猜这永远不会引发异常)并让它获得对指针的所有权。安全的。
然后,在函数内部,我会将原始指针推入std::vector<>
,这也是安全的:如果失败,则不会添加指针,但智能指针仍将拥有指针,因此它将被销毁。如果推送成功,我将删除智能指针对该指针的所有权并返回:这不会引发异常,所以它总是没问题的。
我的理论正确吗?
- 编辑 -
不,我想我不能那样做。这样做需要对右值进行非常量引用(从智能指针中夺走所有权)。我必须写
为此,在我的情况下,这很不方便。我写这个是为了在不污染代码的情况下实现 RAII。那么,做那件事也无济于事。那将是第 22 条渔获物。
-- 编辑 2 --
将 Jason Orendorff 所说的内容拉下来供读者快速参考,最终的解决方案似乎如下:
这解决了无用的非常量引用右值的问题。
当我完成这门课时,我正在编码,我会把它发回这里,以防有人发现它有用。
-- 编辑 3 --
好的,这里已经讨论了很多,还有一些我之前应该澄清的关键点。一般来说,当我在 stackoverflow 上发帖时,我会尝试解释我的问题背后的原因,一般来说,这是完全没用的。所以这次我想我应该直奔主题。结果发现效果不太好XD
不幸的是,我的大脑现在陷入僵局,所以我想我什至无法正确解释我最初想到的是什么来实现我的目标。我正在尝试为原子操作和异常安全的代码编写找到适合许多情况的良好解决方案,但实际上,我无法处理它 XD 我认为这是我只会随着时间的推移才能掌握的东西。
我是一个非常新的 C++ 程序员,我的重点是游戏开发。当游戏引擎中抛出异常时,就是执行的结束。系统将为我的进程释放所有内存,因此是否有一个或两个指针在这里和那里泄漏并不重要。现在我正在开发一个服务器应用程序,我发现处理异常很困难,因为异常不能使服务器崩溃;它必须“使请求崩溃”。
即“嗯,客户端,可惜开发者没有预见到这种情况,所以你以后得试试(到这里,基本上和游戏引擎一样,什么都没有修复,只是它与请求的上下文隔离,而不是整个过程。但是不要惊慌,因为一切都处于有效状态(但是,这是其中一个区别。过程没有终止,所以操作系统不能为你释放资源,而且你要注意撤消到目前为止的操作,这样你就不会完全锁定一个用户的帐户,甚至是服务器提供的全部服务)。”。
我只会越来越多地编写代码并记下我的问题,以便下次我可以写出更好的问题。我现在不准备问这个,我真的很抱歉。
非常感谢您的回复,我真的很喜欢stackoverflow。令人惊讶的是,我的问题得到了如此快速的回答,而您的回答又如此有启发性。谢谢。
c++ - 为什么`myvector.push_back(autoPtr.release())`提供强大的异常安全保障?
编辑:我应该提到,我正在查看Boost 的文档ptr_sequence_adapter
,它声称他们的适配器template< class U > void push_back( ::std::auto_ptr<U> x );
等同于做vec.push_back(autoPtr.release());
,并且还提供了强大的异常保证。然后我意识到我混淆了他们对实施效果的描述与实施的实际情况,所以这个问题是半荒谬的。我只是把它留在这里留给后代。
对我来说,似乎调用std::auto_ptr<t>
会成功,然后调用std::vector<t*>::push_back
可能会引发异常,并且指针会被泄露。
看来您必须这样做:
c++ - 将“动态分配的对象”推回向量是否安全?
每当我需要将动态分配的对象添加到向量中时,我一直在这样做:
它刚刚奏效,许多其他人似乎也在做同样的事情。
今天学习了vector::push_back可以抛出异常。这意味着上面的代码不是异常安全的。:-( 所以我想出了一个解决方案:
但问题是新方法冗长乏味,而且我看到没有人这样做。(至少不在我身边……)
我应该走新路吗?
或者,我可以坚持旧的方式吗?
或者,有没有更好的方法呢?
c++ - 异常安全——何时、如何、为什么?
我只是一个初出茅庐的程序员,至少尝试编写比最佳情况更多的程序。到目前为止,我一直在阅读 Herb Sutter 的“Exceptional C++”,并且已经阅读了三次异常安全章节。但是,除了他提出的示例(堆栈)之外,我不确定何时应该争取异常安全与速度,以及何时这样做很愚蠢。
例如,我目前的家庭作业项目是一个双向链表。因为我已经编写了其中的几个,所以我想花时间来了解一些更深层次的概念,比如 ES。
这是我的弹出式功能:
我对此感到有些困惑。
1)当列表失败时我真的应该抛出错误吗?我不应该简单地什么都不做并返回,而不是强迫列表的用户执行 try {] catch() {} 语句(这也很慢)。
2)有多个错误类(加上我老师要求我们在课堂上实现的 ListException)。这样的事情真的需要自定义错误类吗?是否有关于何时使用特定异常类的一般指南?(例如,范围、长度和边界听起来都一样)
3) 我知道在所有引发异常的代码完成之前,我不应该更改程序状态。这就是我最后减小 size_ 的原因。在这个简单的例子中这真的有必要吗?我知道删除不能扔。head_->prev 在分配为 0 时是否有可能抛出?(头是第一个节点)
我的 push_back 函数:
1) 我经常听说C++ 程序中的任何事情都可能失败。测试 ListElem 的构造函数是否失败(或 tail_ 在new
ing 期间)是否现实?
2)是否有必要测试数据的类型(目前很简单typedef int T
,直到我将所有内容都模板化)以确保该类型对于结构是可行的?
我意识到这些都是过于简单的例子,但我目前只是对何时应该真正练习良好的 ES 以及何时不应该感到困惑。
c++ - 安全的 std::tr1::shared_ptr 使用
这种方法不安全吗?
还是最好createFoo
返回一个shared_ptr<Foo>
对象?
c# - Try/Finally 实际上是异常安全的吗?
假设您有一段代码,例如:
我在这里不是指任何特定的语言,但我想 Java、C# 和 C++ 将是很好的例子(假设你在 MSVC++ 中使用__try
/ )。__finally
这是异常安全的吗?
就个人而言,我不认为这是异常安全的,因为如果在进入块之前出现异常怎么办?try
然后你的资源就会泄露。
不过,我已经看过足够多的时间了,我认为我错过了一些东西……是吗?或者这真的不安全吗?
编辑:
我不是在询问是否allocateResource
抛出异常,而是在该函数返回之后但在分配之前 resource
得到异常的情况。
c++ - 异常安全示例保证正确吗?
我讨论了异常安全保证,并设计了一个我认为提供强保证的示例:
只是一个简单的(C ++ 0x)示例如何使用它:
假设LT
不改变元素,但它可能会抛出。假设代码提供的内容是否正确
- 强异常安全保证
- 异常中性_
LT