如果块内发生异常会发生什么?

时间:2014-08-19 06:07:10

标签: ios objective-c macos exception-handling objective-c-blocks

我只是想了解如果块内发生异常会发生什么?它会在一个单独的线程上运行时抛出的位置。

还有人建议我更好地实施以下两个选项吗?

@try{

[self performBlock^{
some code 
}];

}
@catch (NSException*e) {
}

[self performBlock^{
@try{
some code 
}
@catch (NSException*e) {
}
}];

2 个答案:

答案 0 :(得分:1)

异常通常与发生它们的线程相关联,因此#2是捕获此类异常的更合适方式。

然而,在Objective C或Swift的现实世界中,你根本不想捕捉异常。考虑到像Java或C#这样的Apple运行时很有诱惑力,因为这些语言有例外;但是,异常应该很少用于传达错误,因为它们不安全。在ARC(自动引用计数)下,异常可以留下未释放的内存 - 这是一个相当不理想的问题。

而是使用NSError输出参数。虔诚地检查错误。

你可能认为这是蹩脚的 - 它确实是 - 但它是如何运作的。

答案 1 :(得分:1)

对于#2,它显然会捕获代码中的异常。

对于#1,它取决于此performBlock:方法的作用。尝试阻止捕获堆栈中进一步发生的异常,即同步函数调用。因此,如果performBlock:同步调用其块,则try块将捕获异常。但是如果它异步调用它,那么try块就不会捕获异常,因为当块执行时,try块不在栈中。