我正在将 Java 库转换为 Objective-C。Java 代码公然使用异常(对我的 Objective-C 习惯而言)。转换时,我应该抛出 Objective-C 异常(仅在库中;我会在它们离开之前捕获它们)还是应该使用 NSError 构造。
我熟悉常规 Objective-C 代码中的异常用例;即仅适用于真正的异常错误。如果我在这里没有得到明确的答案,我可能会使用 NSErrors。
我正在将 Java 库转换为 Objective-C。Java 代码公然使用异常(对我的 Objective-C 习惯而言)。转换时,我应该抛出 Objective-C 异常(仅在库中;我会在它们离开之前捕获它们)还是应该使用 NSError 构造。
我熟悉常规 Objective-C 代码中的异常用例;即仅适用于真正的异常错误。如果我在这里没有得到明确的答案,我可能会使用 NSErrors。
如果库可以自己处理所有异常,那么它们就不是 Objective-C 意义上的异常:没有发生程序员错误;相反,完全预料到的事情发生了。您应该根据需要使用使用错误代码/ NSError
,但您可能能够处理异常提供的大部分信息,并只返回一个指示“错误”的值(nil
,0,并且NSNotFound
是一些常见的)和处理那个。您还可以考虑错误处理委托方法。
在 Objective-C 中抛出和捕获异常是昂贵的(除了在 32 位 Mac OS X 上,@try
异常捕获代码的部分是昂贵的部分而不是@catch
部分。)
您最好以某种机制返回错误代码(例如NSError
,在 Objective-C 中执行此操作的 OO 方式)。让那些冒泡到访问您的框架的代码,然后让该代码适当地处理它。
任何一个系统出现错误时的内存清理都不应该是一个大问题,因为您应该能够将大多数对象和分配放在自动释放池中。但是,请注意,池将吃掉在其范围内创建的任何NSError
对象NSException
,因此您必须确保这些对象在代码结束后仍然存在,并具有额外的保留和释放。(有点离题,但我看到很多人在进行错误处理时把这部分搞砸了。)
我只会在 Objective-C 库上返回错误(NSError 方法)。毕竟,这是在C中进行错误处理的方式。
我不会太担心使用或不使用异常。如果它使您的代码更干净,请使用它们。您真正需要注意的唯一一件事是不要通过您不知道异常安全的代码抛出异常,这几乎是您没有编写的所有代码。
是的,使用异常是昂贵的,但担心这是过早优化的一个例子。毕竟,与 C 函数调用相比,Objective-C 消息派发是昂贵的,但你不会听到 Objective-C 程序员说“不要使用 Objective-C 消息”。