1

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

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

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

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

4

1 回答 1

7

不要将异常用于内部错误处理

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

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

更糟糕的是,软件更新会更改实现细节,您的应用程序将开始崩溃。

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

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


要回答您的具体问题,不,这永远不安全:

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

当您@throw退出快速枚举时,您将抛出一帧 Apple 代码,并且该行为被记录为未定义。在实践中,这种简单的模式可能会很好地工作,但“巧合”的维护成本很高。

于 2013-05-11T19:31:57.690 回答