【问题标题】:Can I catch exceptions thrown from one thread in another thread in Objective-C?我可以在 Objective-C 的另一个线程中捕获从一个线程抛出的异常吗?
【发布时间】:2012-02-10 04:47:51
【问题描述】:

是否可以在另一个线程中捕获从一个线程抛出的异常?例如,我正在从我的主线程中生成一个线程。生成的线程可能会抛出未捕获的异常。是否可以让生成线程捕获这些异常?

一种解决方案是从衍生线程的入口点捕获异常,并通过发布NSNotification 来“处理”异常。然后,生成线程可以监听这些NSNotifications。然而,这个解决方案似乎有点笨拙,因为它基本上是在给定不同类型的NSExceptions 作为参数的情况下重新实现@catch 子句。我想检查是否有其他解决方案可用。

【问题讨论】:

  • 请注意,异常仅用于指示 iOS/Mac OS X 中不可恢复的错误。如果你对任何可恢复的东西使用异常,那你就错了。
  • 仅对不可恢复的错误使用异常是一种惯例本身并没有错。使用异常有 3 个常见的反对意见 (a) 它们在 Obj-C 中表现不佳 (b) 资源泄漏 (b2) 内存泄漏。 (a) 如果您仅在 异常 情况下使用它们,则可以缓解 - 无论如何您都应该这样做,(b) 必须以独立于语言的基于异常的设计进行处理,并且处理 (b2)( (b)) 由垃圾收集、Obj-C++ 中的 ARC 或 Obj-C 中的 ARC 以及-fobjc-arc-exceptions 辅助。因此,如果您正确使用异常,您就不会“做错了”。对于您的 Q,请参阅 @Seva。
  • @bbum 这些是“不可恢复”的情况。
  • @CRD 查看最新的异常文档。似乎 64 位应用程序的性能有所改进。尽管如此,对于异常来说,性能应该不是一个大问题,它们应该用于异常情况,这意味着这些情况不会经常发生。
  • @RaffiKhatchadourian 好——我只是在确定。

标签: objective-c multithreading exception exception-handling error-handling


【解决方案1】:

这是不可能的和毫无意义的。抛出线程无法知道生成线程当前是否在try 块内运行。如果不是,它会做什么?推迟投掷直到产卵者愿意接住?如果它永远不会呢?

考虑另一种情况。并且当 spawner 线程正在做某事并且恰好处于不一致状态时,工作线程中会引发异常 - 例如,它正在更新某些数据结构。该异常将中断执行流程并使数据处于所述不一致状态。更不用说生成器所做的任何其他好的任务都将永远不完整。

所以正确的方法是在工作线程的顶层捕获并使用[NSObject performSelector:] 之类的东西传递给生成器线程。应该通知生成器有关生成器中的嘘声的一般想法是可靠的,但是将生成器的异常抛出给生成器是不正确的。注意 - 我说的是“抛出”,而不是通过 Cocoa 提供的其他机制传递。

【讨论】:

  • 它不需要做任何事情。您可以在不知道堆栈上某处是否存在 try 块的情况下抛出异常,可以这么说。
  • +1 异常是一种基于堆栈的机制,每个线程都有自己的堆栈。正如您所建议的,所有可以做的就是在线程中捕获异常并发出信号。
  • 从未捕获的异常使进程崩溃。这是想要的结果吗?
  • @SevaAlekseyev 我不这么认为 :) 编写以“try”开头并以“catch”结尾的线程函数是一个合理的计划..
  • @SevaAlekseyev 不,我想在主线程中捕获异常并在那里处理它。如果NSException 变成NSDistantObject 并传递给主线程上的某个侦听方法而不像我在问题中提到的那样明确编码,那就太酷了。
猜你喜欢
  • 2011-06-25
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2016-07-28
  • 1970-01-01
  • 2012-05-08
  • 2012-11-04
相关资源
最近更新 更多