C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 为什么NSOperation示例代码使用@try&@catch大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Apple的并发编程指南中,NSOperation子类示例(非并发和并发变体)都使用异常处理,我想知道为什么他们在操作中鼓励这种风格.

清单2-4响应取消请求

- (void)main {
   @try {
      BOOL isDone = NO;

      while (![self isCancelled] && !isDonE) {
          // Do some work and set isDone to YES when finished
      }
   }
   @catch(...) {
      // Do not rethrow exceptions.
   }
}

我的理解是,通常异常处理在Objective-C代码中不是常见的做法 – 异常本质上是程序员错误,应该导致应用程序崩溃,而意外的输入最好由NSError处理. (我的错误认识来自thisthis)

我想知道NSOperations是否提供了特殊情况,其中异常处理很重要,或者这更多是该指南的特定作者的首选风格.

作为旁注,一些NSOperation示例代码遵循这种风格,其他示例不.大多数高可见性OSS不使用例外(例如AFNetworking).

解决方法

您的理解是正确的 – NSError(或类似的)应该用于传达错误信息,而不是例外.大多数Objective-C代码不是异常安全的,而且至少会泄漏资源.作为一般规则,永远不要让您的代码泄露给任何其他人的代码 – 无论是苹果还是第三方.一些第三方框架可能会明确指出它们是异常安全的,但很少见.

通过这个原则,你可以看到为什么你应该在你的main方法中有一个catch-all异常处理程序.但实际上还有一个原因:您的操作将在专用线程上运行.从您的操作抛出的异常将传播到堆栈,但没有进一步.逻辑调用者或操作的所有者将不会得到它们,因为它们在不同的线程上运行(或根本不是).所以泄露的例外将会杀死你的整个程序,或者无需其他指示就可以静静地吞下去.您的程序可能会被困在一个奇怪的状态 – 由于您没有意识到发生错误,您可能会继续等待您的操作结果永远不会到达.

此外,苹果在Concurrency Programming Guide年有一个部分,他们谈论了Handling Errors and Exceptions.他们对“离散实体”的第一点指出了我在前一段所说的话:

大佬总结

以上是大佬教程为你收集整理的objective-c – 为什么NSOperation示例代码使用@try&@catch全部内容,希望文章能够帮你解决objective-c – 为什么NSOperation示例代码使用@try&@catch所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。