【问题标题】:What happens if an exception occurs within a block?如果块内发生异常会发生什么?
【发布时间】:2014-08-19 06:07:09
【问题描述】:

我只是想了解如果块内发生异常会发生什么?当它在单独的线程上运行时,它会被扔到哪里。

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

@try{

[self performBlock^{
some code 
}];

}
@catch (NSException*e) {
}

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

【问题讨论】:

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


    【解决方案1】:

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

    对于#1,这取决于performBlock: 方法的作用。 Try 块捕获发生在堆栈下方的异常,即同步函数调用。因此,如果performBlock: 同步调用其块,try 块将捕获异常。但是如果是异步调用,那么try块就不会捕捉到异常,因为当块执行时,try块不在堆栈中。

    【讨论】:

      【解决方案2】:

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

      但是,在 Objective C 或 Swift 的现实世界中,您真的根本不想捕获异常。很容易想到像 Java 或 C# 这样的 Apple 运行时,因为这些语言中都有异常。然而,异常应该很少用于传达错误,因为它们并不安全。在 ARC(自动引用计数)下,异常可能会留下未释放的内存 - 这是一个相当不受欢迎的问题。

      改为使用 NSError 输出参数。认真检查错误。

      您可能认为这很蹩脚 - 确实如此 - 但它就是这样工作的。

      【讨论】:

      • 所以如果一个块中出现异常,那么它不能用#1捕获吗?还是只是#2更有意义?
      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2023-04-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多