在@ try- @ catch- @ finally块中,最终是好用还是继续正常?

时间:2012-01-11 13:57:56

标签: objective-c oop error-handling try-catch

这是一个简单的Objective-C问题。

当您使用@try时,工作流程可以以两种方式运行

  • 如果出现某个NSException,代码会立即跳转到@catch块而不是@finally
  • 如果没有,请完成运行@try块,然后运行@finally

那么,使用或不使用@finally块有什么区别?如果我只使用:

-(void)function{
    @try {
     ...
    }
    @catch (NSException *exception) {
     ...
    }
    >>>The workflow will run this line in any case?
}

如果创建了NSException,那么将运行该函数的其余部分,还是只运行@catch块?

3 个答案:

答案 0 :(得分:15)

“@finally块包含无论是否抛出异常都必须执行的代码。” Does code in finally get run after a return in Objective-C?

finally块用于释放/清理开放套接字,打开文件,数据库锁,信号量锁等资源。

如果catch块内部发生错误或catch块重新抛出异常,则行:

>>>The workflow will run this line in any case?

未执行。但是,应该执行finally块中的代码。 finally块是从即将崩溃的应用程序中彻底退出的最后一个最佳机会。即使应用程序不会崩溃,它仍然是清理资源的最佳位置,因为finally块中的代码更有可能在意外情况下执行,而不是finally块之外的代码。

答案 1 :(得分:4)

有几点需要注意:

  1. 不需要@catch块,你可以使用@ try- @ finally,和 使用@finally块进行必须发生的任何事情(例如清理) 即使发生异常
  2. @catch块不必捕获 NSException,它可能(也可能应该)被更改以捕获更具体的内容 例外。在这种情况下,@ catch块以及下面的代码 @ try- @ catch- @ finally,根据异常
  3. 不会运行

答案 2 :(得分:3)

在这里,其他人的答案中没有几点重要。

  • Apple不建议在生产代码中使用@try @catch @finally子句。他们的处罚太高了,真正的好处很少。在C ++中,防御性代码遍布各处,您可以将应用程序设计为“基于异常”的含义,所有代码都是为堆栈回滚以及抛出和重新抛出异常而设计的,直到它们到达堆栈的顶层。在Obj-C中不是这种情况,即使在C ++中,这种范例也会杀死大多数编译器优化,因为编译器无法在任何情况下快捷方式,因为异常可以在中间打破它。
  • 然而--- Apple提供了Obj-C中的try / catch / finally机制,因此您可以创建仅调试配置的代码,这将帮助您在将应用程序发布到之前识别并捕获(字面上)您的错误。上市。
  • 此外,Apple提供了完整(且漂亮)的“错误处理”范例和协议,在API(NSError对象,嵌套NSErrors NSError恢复协议,NSError显示API等)中备份,适用于您的运行时错误处理应用程序 - 在您的应用程序的“发布”版本中。
  • 以上内容适用于iOS和MacOS-X错误处理。

所以,关于@finally在这里的使用的整个讨论有点夸张。