将Java转换为Objective-C:异常处理

将Java转换为Objective-C:异常处理,java,objective-c,exception,nserror,Java,Objective C,Exception,Nserror,我正在将Java库转换为Objective-C。Java代码公然使用异常(在我习惯于Objective-C的头脑中)。转换时,我应该抛出Objective-C异常(仅在库中;我将在它们离开之前捕获它们)还是应该使用NSError构造 我熟悉常规Objective-C代码中异常的用例;i、 e.仅适用于真正例外的错误。如果我在这里没有得到明确的答案,我可能会使用N错误。我只会返回Objective-C库中的错误(N错误方法)。毕竟,这是在C中进行错误处理的方式,我只会在Objective-C库中返

我正在将Java库转换为Objective-C。Java代码公然使用异常(在我习惯于Objective-C的头脑中)。转换时,我应该抛出Objective-C异常(仅在库中;我将在它们离开之前捕获它们)还是应该使用NSError构造


我熟悉常规Objective-C代码中异常的用例;i、 e.仅适用于真正例外的错误。如果我在这里没有得到明确的答案,我可能会使用N错误。

我只会返回Objective-C库中的错误(N错误方法)。毕竟,这是在C

中进行错误处理的方式,我只会在Objective-C库中返回错误(NSError方法)。毕竟,这是在C

中进行错误处理的方式。如果库能够自己处理所有异常,那么它们就不是客观C意义上的真正异常:没有发生程序员错误;相反,发生了完全预料到的事情。您应该根据需要使用错误代码/
NSError
,但是您可以处理异常提供的大部分信息,只返回一个指示“错误”的值(0和
NSNotFound
是一些常见的错误)并处理它。您也可以考虑错误处理委托方法。

如果库可以自己处理所有异常,那么它们在Word -C意义上不是真正的例外:没有程序员错误发生;相反,发生了完全预料到的事情。您应该根据需要使用错误代码/
NSError
,但是您可以处理异常提供的大部分信息,只返回一个指示“错误”的值(0和
NSNotFound
是一些常见的错误)并处理它。您也可以考虑错误处理委托方法。在Objy-C中,抛出和捕获异常是昂贵的(除了32位Mac OS X,其中<代码> @尝试/代码>异常捕获代码的一部分是昂贵的部分,而不是<代码> @ catch < /COD>部分)。 最好在某种机制中返回错误代码(例如,
NSError
,Objective-C中的OO方法)。让这些错误代码冒泡到访问框架的代码,然后让该代码适当地处理它


任何一个系统发生错误时的内存清理都不应该是一个大问题,因为您应该能够将大多数对象和分配放在自动释放池中。但是,请注意,池将吃掉在其作用域内创建的任何
NSError
NSException
对象,因此您必须确保这些对象在代码结束后仍然存在,并有额外的保留和释放。(有点离题,但我看到很多人在处理错误时把这部分搞糟了。)

在Objective-C中抛出和捕获异常是昂贵的(在32位Mac OS X上除外,其中异常捕获代码的
@try
部分是昂贵的部分,而不是
@catch
部分。)

最好在某种机制中返回错误代码(例如,
NSError
,Objective-C中的OO方法)。让这些错误代码冒泡到访问框架的代码,然后让该代码适当地处理它


任何一个系统发生错误时的内存清理都不应该是一个大问题,因为您应该能够将大多数对象和分配放在自动释放池中。但是,请注意,池将吃掉在其作用域内创建的任何
NSError
NSException
对象,因此您必须确保这些对象在代码结束后仍然存在,并有额外的保留和释放。(有点离题,但我看到很多人在处理错误时把这部分搞糟了。)

我不太担心是否使用异常。如果它能让你的代码更干净,就使用它们。唯一需要注意的是,不要在不知道异常安全的代码中抛出异常,这几乎是您没有编写的所有代码


是的,使用异常是昂贵的,但担心这是过早优化的一个例子。毕竟,与C函数调用相比,Objective-C消息分派的成本很高,但您不会听到Objective-C程序员说“不要使用Objective-C消息”。

我不会太担心使用或不使用异常。如果它能让你的代码更干净,就使用它们。唯一需要注意的是,不要在不知道异常安全的代码中抛出异常,这几乎是您没有编写的所有代码


是的,使用异常是昂贵的,但担心这是过早优化的一个例子。毕竟,与C函数调用相比,Objective-C消息调度的成本很高,但您不会听到Objective-C程序员说“不要使用Objective-C消息”。

感谢所有回答的人。如果您无法从错误中恢复,请使用异常。例如,如果API的用户提供非法参数而违反了合同,或者您遇到的问题可能只是由您的编程错误引起的。感谢所有回答的人。如果您无法从错误中恢复,请使用异常。例如,如果您的API用户提供非法参数而违反合同,或者您遇到的问题可能只是由您的编程错误引起的。但这将违背惯用的Objective-C代码和苹果公司的建议。其他阅读代码的人希望看到不可恢复错误的异常,而不是可恢复的错误。@AdamSmith从苹果公司得到的建议不是福音。然而,Objective-C中异常的工作方式(或不工作)使得它们对于可恢复的错误几乎毫无用处