1

I understand what the @try and @catch blocks do, but what does @throw do?

@try{

/**Insert code here**/

}

@catch(NSException * myException){

/**insert code **/

}

Where does @throw fit in all this? A simple example would be really helpful.

I checked out this link but couldn't find the answer I was looking for.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/RaisingExceptions.html

4

3 回答 3

2

Objective-C 中的异常主要用于明显的程序员错误的情况,例如试图访问NSArray. 相比之下,一些编程语言使用异常来指定任何类型的可恢复错误,例如“找不到文件”,但在 Objective-C 和 Cocoa 中,NSException抛出异常@throw通常意味着无法恢复。

在任何一种情况下,类比都是异常被“抛出”给捕获器,无论在抛出器和捕获器之间有多少函数调用。这与通过返回值或输出参数返回错误状态的函数形成对比。返回错误状态的函数需要确保链中的所有其他函数都返回相同的错误状态,以便另一端的原始调用者知道有错误。抛出的异常会绕过所有中间函数,并将错误直接发送到所需的位置,即原始调用站点。

void function3()
{
    @throw [NSException exceptionWithName:@"Test" reason:@"Test" userInfo:nil];
}

void function2()
{
    function3();
}

void function1()
{
    function2();
}

int main()
{
    @try
    {
        function1();
    }
    @catch(NSException *ex)
    {
        // handle exception that occurred 3 functions deep
    }
}

通常,由于内存管理的工作方式,您应该避免在 Objective-C 中将异常作为捕获可恢复错误的一般方法。在上面,如果在 中分配了任何对象function1function2或者function3没有自动释放,那么这些对象的内存将被泄漏。启用“完全异常安全”的 ARC 能够检测这些情况并适当地处理它们,但这仅适用于您自己代码中的对象,而不适用于您可能使用的外部库分配的任何内存。人们普遍认为您的应用程序不会从@throw.

在此问答中查看更多详细信息。

于 2013-07-26T04:24:14.433 回答
1

如果操作失败并引发异常,例如:

@try{ // code fails and raises an exception 
      if (!objectNotInMemory)
      {
          @throw exc; // presuming you already initialized NSException* exc
      }
}
@catch (NSException* e){ // deal with exception exc
    if ([[e reason] isEqualToString:@"Object not in memory"])
    UIAlertView* alert = [UIAlertView initWith...];
}

引发该异常的事物(在这种情况下,objectNotInMemory 不存在、nil 或 0)具有@throw{}创建或传递某种 NSException 对象或消息的指令。然后可以在@catch{}块中捕获此异常对象,或者如果忽略,将警告操作系统关闭应用程序进程。

必须抛出异常才能被捕获。

更多阅读 Apple 文档(您应该对此感到满意):

@try — 定义作为异常处理域的代码块:可能引发异常的代码。

@catch() — 定义一个块,其中包含用于处理 @try 块中抛出的异常的代码。@catch 的参数是本地抛出的异常对象;这通常是一个 NSException 对象,但也可以是其他类型的对象,例如 NSString 对象。

@finally — 定义一个相关代码块,无论是否抛出异常,该代码块随后都会被执行。

@throw — 抛出异常;该指令在行为上与 NSException 的 raise 方法几乎相同。您通常会抛出 NSException 对象,但不限于它们。有关@throw 的更多信息,请参阅“抛出异常”。</p>

于 2013-07-26T04:31:57.337 回答
1

@throw 让你,等待它,抛出异常,为什么我们要抛出异常?当发生异常情况时,我们会抛出异常,例如,在下面的代码中,库存数组大小为零是没有意义的,因此对于这种特殊情况,我们会抛出异常。

NSString *getRandomCarFromInventory(NSArray *inventory) {
    int maximum = (int)[inventory count];
    if (maximum == 0) {
        NSException *e = [NSException
                         exceptionWithName:@"EmptyInventoryException"
                         reason:@"*** The inventory has no cars!"
                         userInfo:nil];
        @throw e;
    }
    int randomIndex = arc4random_uniform(maximum);
    return inventory[randomIndex];
}

这个例子的更多信息:http ://rypress.com/tutorials/objective-c/exceptions.html (强调我的)

iOS 或 OS X 应用程序运行时可能会出现两种不同类型的问题。异常代表程序员级别的错误,例如尝试访问不存在的数组元素。它们旨在通知开发人员发生了意外情况。由于它们通常会导致程序崩溃,因此您的生产代码中应该很少出现异常。

于 2013-07-26T04:05:44.787 回答