将 Java 转换为 Objective-C:异常处理
Posted
技术标签:
【中文标题】将 Java 转换为 Objective-C:异常处理【英文标题】:Converting Java to Objective-C: Exception Handling 【发布时间】:2010-07-17 14:42:05 【问题描述】:我正在将 Java 库转换为 Objective-C。 Java 代码公然使用异常(对我的 Objective-C 习惯而言)。转换时,我应该抛出 Objective-C 异常(仅在库中;我会在它们离开之前捕获它们)还是应该使用 NSError 构造。
我熟悉常规 Objective-C 代码中的异常用例;即仅适用于真正的异常错误。如果我在这里没有得到明确的答案,我可能会使用 NSErrors。
【问题讨论】:
【参考方案1】:在 Objective-C 中抛出和捕获异常是昂贵的(除了在 32 位 Mac OS X 上,异常捕获代码的 @try
部分是昂贵的部分,而不是 @catch
部分。)
你最好在一些机制中返回错误代码(例如NSError
,在Objective-C中这样做的OO方式)让那些冒泡到访问你的框架的代码,然后让那个代码会适当地处理它。
在任何一个系统出现错误的情况下清理内存都不应该是一个大问题,因为您应该能够将大多数对象和分配放入自动释放池中。但是,请注意,池将吃掉在其范围内创建的任何 NSError
或 NSException
对象,因此您必须确保这些对象在代码结束后仍然存在,并具有额外的保留和释放。 (有点跑题了,但是我看到很多人在处理错误时把这部分搞砸了。)
【讨论】:
感谢所有回答的人。 如果您无法从错误中恢复,请使用异常。例如。如果您的 API 用户因提供非法参数而违反合同,或者您遇到的问题可能仅由您的编程错误引起。【参考方案2】:如果库可以自己处理所有异常,那么它们就不是 Objective-C 意义上的异常:没有发生程序员错误;相反,完全预料到的事情发生了。您应该根据需要使用错误代码/NSError
,但您可以处理异常提供的大部分信息,并返回一个指示“错误”的值(nil
、0 和 @987654323 @ 是一些常见的)并处理它。您还可以考虑错误处理委托方法。
【讨论】:
【参考方案3】:我只会在 Objective-C 库上返回错误(NSError 方法)。毕竟,这是 C 中的错误处理方式。
【讨论】:
【参考方案4】:我不会太担心使用或不使用异常。如果它使您的代码更干净,请使用它们。您真正需要注意的唯一一件事是不要通过您不知道异常安全的代码抛出异常,这几乎是您没有编写的所有代码。
是的,使用异常是昂贵的,但担心这是过早优化的一个例子。毕竟,与 C 函数调用相比,Objective-C 消息派发是昂贵的,但你不会听到 Objective-C 程序员说“不要使用 Objective-C 消息”。
【讨论】:
除非这会违背惯用的 Objective-C 代码和 Apple 的建议。其他阅读代码的人希望看到不可恢复错误的异常,而不是可恢复错误。 @AdamSmith Apple 的建议并非福音。然而,异常在 Objective-C 中的工作方式(或不工作)使得它们对于可恢复的错误几乎没有用处。 我同意,但 Apple 通常会出于充分的理由给出他们的建议。你应该有充分的理由不遵循它。有些选择当然是武断的,但由于 Objective-C 开发人员已经习惯了它们,所以坚持使用它们是有意义的,除非有充分的理由不这样做。以上是关于将 Java 转换为 Objective-C:异常处理的主要内容,如果未能解决你的问题,请参考以下文章
将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?
Objective-C:如何将 NSIndexSet 转换为 NSIndexPath
如何将 Objective-C 的完成块转换为 Swift?