在使用-fobjc-arc-exceptions编译的文件中快速枚举异常安全



我正在考虑在我编写的库中使用异常进行内部错误处理。如果使用它们,库将在arc和f-objc-arc-exceptions启用的情况下构建。

obj-c异常的一个问题是必须小心不要抛出任何你不知道是异常安全的代码。当使用-fobjc-arc-exceptions编译文件时,由编译器异常添加的枚举代码安全吗?

据我所知,

应该是这样的,因为我看不出有任何理由让它做任何需要清理的事情。但如果这种行为在某处被记录下来,我会更乐意使用它。

Edit:我应该澄清一下,当我说"使用异常进行内部错误处理"时,我指的是非致命错误。所以这里的"异常安全"意味着不应该有内存泄漏,没有未释放的锁,等等。

不要对内部错误处理使用异常

在最好的情况下,您最终会得到与系统代码具有不同设计和感觉的代码。两者之间的边界总是需要维护和考虑,因为它增加了"我在异常行为围栏的哪一边?"

实际上,这将是一场维护噩梦。每次重构代码时——可能是为了利用系统中的新特性——您都必须不断地维护两种异常处理之间的边界。

最坏的情况是,软件更新改变了实现细节,你的应用会开始崩溃。

这些库被设计成不对可恢复的错误使用异常。如果你想要最小化代码的拥有成本,你的代码应该遵循相同的模式。

系统上有几个库在内部使用异常处理可恢复的错误。它们是bug和维护难题的持续来源。


回答你的具体问题,No, this is never safe:

@try {
    for ( id x in array ) { ... do something that might @throw ... }
} @finally {
    ...
}

当你在快速枚举中使用@throw时,你正在抛出苹果代码的框架,并且该行为被记录为未定义。在实践中,这样一个简单的模式可能会工作得很好,但是"巧合地工作"有很大的维护成本。

最新更新