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

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

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

  4. 什么是 throw 指令?书籍说它使您能够抛出自己的异常。但我觉得这真的很混乱。这是否意味着我可以以某种方式创建一个异常并对其进行测试?

如果您能为我回答至少一个问题,我将不胜感激。谢谢你。

4

2 回答 2

5

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

因此,考虑到这一点,您提到的指令允许 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 指令?书籍说它使您能够抛出自己的异常。

@throw;(不带参数)在 catch 块中重新抛出与 catch 块正在处理的相同的异常,以便可以在更高级别处理它。

听起来您可能正在阅读Steven Kochan的 Objective-C 编程。如果我没记错的话,Kochan 试图教你脱离 Cocoa 和 Cocoa Touch 的 Objective-C。这在某种程度上可能是有道理的,但在这种情况下,它可能会使您感到困惑,尤其是当您尝试学习该语言以便可以使用其中一个或两个框架时。鉴于Apple 反对在代码中使用异常的建议,停止阅读并继续下一章可能是安全的。

于 2013-04-09T21:23:55.150 回答
1

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

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

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

但是,您可以使您的代码块成为一个try子句(通过在 之前放置tryor@try或其他任何方式{),在该子句之后加上一个catch子句,然后,当发生异常时,控制将转移到catch子句的开头。

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

当给定范围未处理异常时try/catch,它会“冒泡”到该try/catch方法或其调用者中的下一个外部。最终到达一个未处理的异常main并且默认处理程序获得控制。

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

finally例如,可以使用它来关闭打开的文件或释放一些分配的临时资源。

于 2013-04-09T21:20:11.090 回答