我只是想了解如果块内发生异常会发生什么?它会在一个单独的线程上运行时抛出的位置。
还有人建议我更好地实施以下两个选项吗?
@try{
[self performBlock^{
some code
}];
}
@catch (NSException*e) {
}
或
[self performBlock^{
@try{
some code
}
@catch (NSException*e) {
}
}];
答案 0 :(得分:1)
异常通常与发生它们的线程相关联,因此#2是捕获此类异常的更合适方式。
然而,在Objective C或Swift的现实世界中,你根本不想捕捉异常。考虑到像Java或C#这样的Apple运行时很有诱惑力,因为这些语言有例外;但是,异常应该很少用于传达错误,因为它们不安全。在ARC(自动引用计数)下,异常可以留下未释放的内存 - 这是一个相当不理想的问题。
而是使用NSError输出参数。虔诚地检查错误。
你可能认为这是蹩脚的 - 它确实是 - 但它是如何运作的。
答案 1 :(得分:1)
对于#2,它显然会捕获代码中的异常。
对于#1,它取决于此performBlock:
方法的作用。尝试阻止捕获堆栈中进一步发生的异常,即同步函数调用。因此,如果performBlock:
同步调用其块,则try块将捕获异常。但是如果它异步调用它,那么try块就不会捕获异常,因为当块执行时,try块不在栈中。