我可以捕获Objective-C中另一个线程中从一个线程抛出的异常吗?

时间:2012-01-14 02:53:39

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

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

一种解决方案是从生成的线程的入口点捕获异常,并通过发布NSNotification来“处理”异常。然后,产卵线程可以监听这些NSNotification。但是,这个解决方案似乎有点软木塞,因为它基本上重新实现了@catch子句,给出了不同类型的NSException s作为参数。我想检查是否有其他解决方案可用。

1 个答案:

答案 0 :(得分:3)

这是不可能的,毫无意义的。抛出线程无法知道产生线程当前是否在try块内运行。如果没有,它会做什么?推迟投掷,直到产卵者关心捕获?如果它永远不会怎么样?

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

因此,正确的方法是捕获工作线程的顶层并使用[NSObject performSelector:]之类的东西传递给spawner线程。产卵者应该被告知spawnee中的booboos的一般想法是坚实的,但抛出spawnee的例外产生是不对的。注意 - 我说“扔”,而不是通过Cocoa提供的其他机制。