我需要澄清这些术语的例外和指令@Try,@ finally,@ throw

时间:2013-04-09 21:00:04

标签: objective-c

  1. 发生异常的一般原因是什么?当出现异常时,程序是立即终止还是继续运行?

  2. 我猜@try是我正在测试的程序信息。是吗?

  3. 在@catch之后记录错误信息,清理等等,@ finally块会做什么?我正在阅读的书中说@finally确定@try中的语句是否会引发异常。但这不是一个不必要的步骤,因为有或没有它,我们可以判断是否存在基于程序突然终止的异常?

  4. 什么是throw指令?这些书说它可以让你抛出自己的异常。但我发现这真的令人困惑。这是否意味着我可以以某种方式创建一个例外并测试它?

  5. 如果你能为我回答至少一个问题,我将非常感激。 谢谢。

2 个答案:

答案 0 :(得分:5)

异常提供了一种在正常执行流程之外处理错误和其他异常事件的机制。它们允许程序员通过消除不断检查和处理错误的需要来编写更清晰的代码。相反,当发生错误时,代码可以“抛出”异常对象,并且执行将在该点停止并在可以处理异常的第一个“catch”块处继续。我可以进一步解释,但我相信通过阅读相关的维基百科页面,你会得到更好的例外解释。

因此,考虑到这一点,您提到的指令允许Objective-C中的异常:

  • @try: try块中的代码可能会抛出异常。 try块通常后跟catch块,它可以捕获try块中代码可能引发的任何异常,但是也可能需要在更高级别处理给定的异常。在这种情况下,相关的catch块可能位于更高的某个位置,就像使用try块调用方法的方法或上面的方法一样。 (这些方法也会有调用当前方法的try块。)

  • @catch: Catch块包含用于处理给定异常的代码,并希望从异常情况中恢复。

  • @finally: finally块包含为try块执行任何所需清理的代码。例如,如果try块分配了一些资源,则finally块可以在允许异常移动到下一个catch处理程序之前释放这些资源。

  • @throw:这是一个用于“抛出”异常的指令。 try块的执行在抛出异常的位置停止,并且catch块将处理(或不处理)异常。 (未处理的异常通常会导致程序终止。)

现在,尽管如此,您通常应该避免在Objective-C 中出现异常。我知道将这个伟大的功能内置到语言中然后无法使用它似乎很奇怪,但Objective-C程序几乎总是使用Cocoa或Cocoa Touch框架编写,并且这些框架不希望有异常抛出框架调用。

  

异常发生的一般原因是什么?当一个例外   程序是否会立即终止或继续运行?

当发生意外事件而导​​致代码无法继续时,您会抛出异常。例如,尝试访问仅包含n个项的数组中的第n + 1个元素会引发异常。在Cocoa或Cocoa Touch程序中,例外是终端。但是,在其他语言和框架中,可以处理异常以允许程序继续运行。

  

@catch之后要么记录错误信息,要么清理等等   @finally阻止吗?

无论是否抛出异常,finally块都会运行,因此您不需要在try块和catch块中都有清理代码。此外,catch块通常会捕获较低级别的异常,因此它们可能无法清理。

  

什么是throw指令?这些书说它可以让你抛出自己的例外。

catch块中的

@throw;(没有参数)会重新抛出catch块正在处理的异常,以便可以在更高级别处理它。

听起来你可能正在阅读Steven Kochan的 Programming in Objective-C 。如果我没记错的话,Kochan试图教你与Cocoa和Cocoa Touch脱离的Objective-C。这可能在某种程度上是有意义的,但这是一个案例,它可能会使你更加困惑,特别是如果你试图学习语言,以便你可以使用这些框架中的一个或两个。给定Apple's advice against using exceptions in your code,停止阅读并继续下一章可能是安全的。

答案 1 :(得分:1)

了解您有一段代码 - 在{}个字符之间 - 可能会产生运行时错误消息。在许多系统中,运行时错误消息被发送到某个日志并被忽略,或者导致应用程序突然终止。

除了异常之外,检测错误的代码会创建一个异常对象,并使用throw语句或方法“抛出”它。

如果未处理异常,它将“冒泡”到main级别并导致应用终止(通常在默认处理程序打印消息后等)。

但是,您可以将代码块设为try子句(通过放置try@try{之前的任何内容),然后按照catch子句,然后,当异常发生时,控制权将转移到catch子句的开头。

catch子句可以查看异常对象并决定如何处理它。实现稍有不同,但通常如果catch子句不执行任何操作,则会忽略该异常并在try/catch子句后继续执行。另一方面,如果catch子句不能以某种方式“处理”异常(因此异常应该被忽略),{{1 }}子句将执行catch以重新抛出原始异常或新创建的异常。

如果某个异常未由给定的throw范围处理,则会在该方法或其调用者中“冒泡”到下一个外部try/catch。最终,未处理的异常到达try/catch,默认处理程序获得控制权。

main是大多数异常处理模型的一个特性,不是关键函数,但非常方便。如果在不生成异常的情况下执行finally范围,则执行try/catch子句,然后在finally子句之后继续执行。另一方面,如果在finally范围内引发异常但未处理,则执行try/catch子句,然后异常“冒泡”,而不执行以下代码。

可以使用

finally来关闭打开的文件或释放一些已分配的临时资源。