iOS中的例外Handeling

阅读文档并通过Apple示例代码(以及大部分可用的第三方Objective-C代码),我觉得您不应该使用try / catch和“traditional / C”来做exception处理,方法。
最近我正在阅读亚马逊AWS iOS SDK,并注意到他们已经使用了旧的方法。
这对我来说是一种解脱,因为我总是觉得我需要确保在使用别人编写的代码或二进制库(我的意思是Google Analytics二进制文件等)时特别注意这个exception。 我的问题是,是否有任何理由避免iOS上的“传统”exception处理“,或者这不是一个有品位的Objective-C实践?

有充分理由避免iOS上的例外。

iOS上的例外情况明确保留为无法从中恢复的灾难性故障。 他们不打算被用来做捕获和恢复types的操作。

重要提示:您应该保留使用exception编程或意外的运行时错误,如超出范围的集合访问,试图改变不可变的对象,发送无效的消息,并失去与窗口服务器的连接。 在创build应用程序时,而不是在运行时,您通常会处理这些types的exception。

如果您拥有使用exception处理错误情况的现有代码体(如第三方库),则可以在Cocoa应用程序中按原样使用代码。 但是您应该确保任何预期的运行时exception不会从这些子系统中转义,并最终以调用者的代码结束。 例如,parsing库可能会在内部使用exception来指示问题,并且可以从可能深度recursion的parsing状态快速退出; 但是,您应该注意在库的顶层捕捉这些exception,并将其转换为适当的返回代码或状态。

这导致两个问题(其中包括):

  • 你不能通过一个系统框架代码框架抛出exception。 行为是不确定的。

  • 如果你devise你的代码来使用exception,你的代码和系统之间的边界将会有一个巨大的阻抗不匹配。 这不仅会令人尴尬,而且随着边界的转移,将会使所有未来的维护和重构操作变得更加困难。 这也会使得与系统整合更加困难。

请注意,如果AWS SDK通过系统框架所拥有的堆栈框架引发exception,那么这是错误的。

bbum是现货。 看起来像AWS iOS SDK正在转向基于NSError的未来版本的方法。 到目前为止,他们提供了阻止exception和使用NSErrors的机制。

 #import <AWSiOSSDK/AmazonErrorHandler.h> // put this in didFinishLaunching [AmazonErrorHandler shouldNotThrowExceptions]; 

更多细节在这里:
https://mobile.awsblog.com/post/Tx2PZV371MJJHUG/How-Not-to-Throw-Exceptions-with-the-AWS-SDK-for-iOS