我正在考虑在我正在编写的库中使用异常进行内部错误处理。如果使用它们,库将使用arc构建并启用f-objc-arc-exceptions
。
obj-c异常的一个问题是必须注意不要抛弃任何你不知道的异常安全代码。使用-fobjc-arc-exceptions
编译文件时,编译器异常添加的枚举代码是否安全?
据我所知,它应该是,因为我看不出有任何理由去做任何需要清理的事情。但如果在某处记录这种行为,我会更乐意使用它。
编辑:我应该澄清,当我说“使用异常进行内部错误处理”时,我说的是非致命错误。所以“异常安全”在这里意味着不应该有内存泄露,没有未发布的锁等等。
答案 0 :(得分:7)
不要对内部错误处理使用例外。
充其量,您最终会得到的代码与系统代码的设计和感觉不同。两者之间的边界总是需要维护和考虑,因为它增加了“我在哪个异常行为栏的哪一侧?”
实际上,这将是一场维护噩梦。每次重构代码时 - 可能利用系统中的新功能 - 您将不断地保持两种异常处理之间的边界。
更糟糕的是,会有一个更新实施细节的软件更新,您的应用程序将开始崩溃。
这些库旨在不使用可恢复错误的异常。如果您希望最小化该代码的所有权成本,则您的代码应遵循相同的模式。
系统上有几个库在内部使用异常来处理可恢复的错误。它们是导致错误和维护问题的常见原因。
要回答您的具体问题,不,这绝不安全:
@try {
for ( id x in array ) { ... do something that might @throw ... }
} @finally {
...
}
当您@throw
快速枚举时,您正在抛出一段Apple代码,并且行为被记录为未定义。在实践中,这样一个简单的模式可能会运行得很好,但“巧合”会产生很大的维护成本。