异常提供了一种机制来处理正常执行流程之外的错误和其他异常事件。它们允许程序员通过消除不断检查和处理错误的需要来编写更清晰的代码。相反,当错误发生时,代码可以“抛出”一个异常对象,并且执行将在该点停止并在第一个可以处理异常的“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 反对在代码中使用异常的建议,停止阅读并继续下一章可能是安全的。