问题标签 [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.
objective-c - 安全地处理来自 C 代码库的 Objective C 用户代码
首先让我说我在Objective C编程方面的知识非常有限。
我有一个 C 可执行文件,它调用用 Objective C 编写的用户定义函数。
假设用户代码中可能发生任何事情,那么安全包装代码以使 C 函数正常返回的最佳方法是什么?
在 C++ 包装器中,我将编写一个函数尝试捕获所有异常,以防止 C++ 异常传播到 C 代码中,其中行为未由 C 标准定义。
我想我应该首先防止任何 ObjC 异常跨越语言边界(即传播到 C 代码中),所以我会编写一个像这样的包装器:
但是,我对语言的有限了解并不能告诉我是否有其他机制可以使用户代码跨越模块边界并导致未定义的异常。
此外,如果入口点是纯 C,在调用用户函数之前是否需要对 Objective C 运行时进行任何初始化/清理?
注意:信号和 exit() 不需要处理,因为包装器在分叉进程中运行。
python-3.x - 干净且可选地将 stderr 或 stdout 重定向到文件
我有一个 Python3 脚本,我想有选择地重定向stdout
到stderr
一个文件。像这样的东西:
这行得通,除非我中间的代码决定退出。那么我的文件不能保证被关闭。无论代码中发生什么并且仅在某些时候发生,我如何才能干净地关闭这些文件?(通常,我会通过 shell 重定向,但我在 Python 中计算文件名,我不想在各种 shell 中重新计算它们。另外,我不想为是否重定向的逻辑在 shell 脚本中。如果可能的话,我希望这些分支出现在我的主代码中。)
尝试 1
似乎上下文管理器将是这里的方法,但是,当我尝试使用它们时,我必须多次重写我的代码,它不是漂亮的代码:
尝试 2
我决定为它制作一个上下文管理器。我认为它有效,Python 并没有对我大喊大叫,但我仍然不禁觉得它不是太 Pythonic,而且我不完全确定它是否安全。我正在向if
奇怪的方向推进这些陈述。有没有更好的办法?
c++ - 空容器的 std::terminate 和析构函数
考虑一些使用动态内存(即AllocatorAwareContainer)并且大小和容量为零的标准容器。例如,接 astd::vector
并调用vec.resize(0); vec.shrink_to_fit();
。
我想这样的容器实例将只包含nullptr
其逻辑内容的指针和std::size_t
跟踪信息的成员,例如size
. 我还想他们的析构函数基本上什么都不做,因为没有动态内存可以释放。
据我所知,所有容器的析构函数都是noexcept
. 即在销毁期间抛出异常时,他们应该调用std::terminate
. Allocator::deallocate()
在抛出异常的情况下是可能的。
我可以确定上述状态中的容器永远不会要求std::terminate
销毁吗?
c++ - 声明 POD 类型可以抛出异常吗?
当我声明 acondition_variable
时,它可能会抛出std::system_error
.
但是当我声明一个 POD 类型(例如int
,double
或float
)时呢?
就像下面的代码:
如果声明一个POD类型可能会抛出异常,我如何保证
是noexcept
?
c++ - c++中容器的异常安全
我遇到了这个术语异常安全的容器。我想了解异常安全的确切含义是什么?对于不同的容器,是否有任何比较?
c++ - std::list 的多元素插入是否具有很强的异常安全性?
在第 17 项中exceptional c++
,我发现:
首先,对于所有容器,多元素插入(“迭代器范围”插入)绝不是强异常安全的。
但在第 1 项中effective STL
,我发现:
如果您需要多元素插入的事务语义(例如,范围形式 — 参见第 5 条),您将需要选择 list,因为 list 是唯一为多元素插入提供事务语义的标准容器。
在页面249
中the c++ standard library 2th
,我发现:
对于列表,即使是多元素插入操作也是事务安全的。
所以我的问题是哪一个是对的?强异常安全意味着与事务安全相同吗?
c - 如何防止缓冲区溢出/数组溢出?
我最近正在为自定义串行通信协议编写代码。我所做的是,我使用了接收数据的一部分(8/16 位)来表示帧大小有多大。基于这些数据,我预计没有数据可以遵循。我使用 Crc 来接受或拒绝一个框架。但是我不能在 Crc 中包含帧长度数据,因为在接收端我应该知道在处理帧之前需要多少数据。
我面临的问题是,有时这个帧长度数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小要小得多。这会破坏连续内存位置中存在的许多关键系统变量。
如何防止发生缓冲区溢出?我对此的想法 1)如果帧长度数据超过某个值,则拒绝它。2)使用限制最大数量的数据类型。就像使用 short 将数组索引的范围限制为 256 个内存位置,并创建一个 280 字节的缓冲区。3)在单独的位置分配内存,这样它就不会影响关键的系统变量。
我用来防止卡在接收循环中的一件事是使用超时。但我忽略了这个问题。如果有时间确认和重现该问题,我会觉得很多,因为代码是更大系统代码的一部分,我不是这里的专家。
一般如何安全地处理这类问题?
另外:使用数组时要遵循的一般注意事项或标准做法是什么,以防止它溢出?
c++ - 是否有 C++ 标准类将变量设置为范围退出时的值
在成员函数的范围内,我想暂时将成员变量设置为某个值。
然后,当此函数返回时,我想将此成员变量重置为给定的已知值。
为了防止异常和多次返回,我用一个简单的 RAII 类来完成它。它是在成员函数的范围内定义的。
这似乎很常见,我想知道在 C++ 标准库中是否有这样的模板类?
c++ - 异常安全保证和 std::move()
在一些实现过程中,我遇到了关于异常安全保证和使用std::move()
. 我知道 SO 不是问“你的意见是什么”(类模板Boo
)这类问题的好地方,但在这里我想确定我的理解是否正确,在你阅读了这个问题之后,也许你可以指导我正确的道路。
考虑以下代码:
看一下add()
成员函数,如果从(1)中抛出异常并根据n4296 [vector.modifiers/1]
如果在末尾插入单个元素时抛出异常
T
isCopyInsertable
或is_nothrow_move_constructible<T>::value
istrue
,则没有效果。
那么强保证被保留了,对吗?
如果我们看(2)那么这里也可以抛出异常,因为(3)可以抛出异常。如果我错了,请纠正我:在这种情况下(2),如果我移动src
到成员函数并且从那时process()
抛出异常是未指定的,这意味着只保留基本保证?process()
src
为了使add()
成员函数得到强有力的保证,我应该将(2)和(F)分别更改为:
?
那么如果Foo::src
元素数量巨大,那么做强保证会降低效率(因为必须制作额外的副本)?
也许保证级别应该由类的用户决定,通过使其成为类模板,类似于:
这是个好主意还是坏主意?