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

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

据我所知,应该是这样,因为我看不出有任何原因需要它进行清理。但是,如果在某处记录了此行为,我会更高兴地使用它。

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

最佳答案

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

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

实际上,这将是维护的噩梦。每次重构代码(可能要利用系统中的新功能)时,您都将不得不不断维护两种异常处理之间的界限。

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

库被设计为不使用可恢复错误的异常。如果要最大程度地减少代码的拥有成本,则代码应遵循相同的模式。

系统上有两个库在内部使用异常来恢复可恢复的错误。它们是漏洞和维护难题的源头。

要回答您的特定问题,不,这永远都不安全:

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

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

关于ios - 使用-fobjc-arc-exceptions编译的文件中的快速枚举异常安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16499100/

10-11 22:23
查看更多