Objective c @throw完成了什么

Objective c @throw完成了什么,objective-c,Objective C,我理解“尝试”和“捕捉”块的作用,但“投掷”块的作用是什么 @try{ /**Insert code here**/ } @catch(NSException * myException){ /**insert code **/ } @throw在这一切中的作用是什么?举个简单的例子会很有帮助 我查看了这个链接,但找不到我想要的答案 @throw允许您等待,抛出异常,以及我们为什么要抛出异常? 当异常情况发生时,我们抛出异常,例如,在下面的代码中,库存数组大小为零是没有意义的,因此对

我理解“尝试”和“捕捉”块的作用,但“投掷”块的作用是什么

@try{

/**Insert code here**/

}

@catch(NSException * myException){

/**insert code **/

}
@throw在这一切中的作用是什么?举个简单的例子会很有帮助

我查看了这个链接,但找不到我想要的答案


@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];
}
本示例提供了以下方面的进一步信息: (强调矿山)

在使用iOS或OSX时,可能会出现两种不同类型的问题 应用程序正在运行。异常表示程序员级别的错误 就像试图访问一个不存在的数组元素<他们是 旨在通知开发人员发生意外情况 发生。因为它们通常会导致程序崩溃, 生产代码中很少会出现异常


@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];
}
本示例提供了以下方面的进一步信息: (强调矿山)

在使用iOS或OSX时,可能会出现两种不同类型的问题 应用程序正在运行。异常表示程序员级别的错误 就像试图访问一个不存在的数组元素<他们是 旨在通知开发人员发生意外情况 发生。因为它们通常会导致程序崩溃, 生产代码中很少会出现异常


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

无论哪种情况,类比都是异常被“抛出”到捕捉器,不管抛出器和捕捉器之间有多少个函数调用。这与通过返回值或输出参数返回错误状态的函数形成对比。返回错误状态的函数需要确保链中的所有其他函数返回相同的错误状态,以便另一端的原始调用方知道有错误。抛出的异常绕过所有中间函数,并将错误直接传递到需要的地方,即原始调用站点

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中抛出异常作为捕获可恢复错误的一般方法。在上述情况下,如果在
function1
function2
function3
中分配了任何对象,但没有自动释放,则这些对象的内存将泄漏。启用“完全异常安全”的ARC能够检测这些情况并适当地处理它们,但这仅适用于您自己代码中的对象,而不适用于您可以使用的外部库分配的任何内存。一般认为,您的应用程序不会从使用
@throw
引发的异常中恢复


请参阅更多详细信息。

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

无论哪种情况,类比都是异常被“抛出”到捕捉器,不管抛出器和捕捉器之间有多少个函数调用。这与通过返回值或输出参数返回错误状态的函数形成对比。返回错误状态的函数需要确保链中的所有其他函数返回相同的错误状态,以便另一端的原始调用方知道有错误。抛出的异常绕过所有中间函数,并将错误直接传递到需要的地方,即原始调用站点

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中抛出异常作为捕获可恢复错误的一般方法。在上述情况下,如果在
function1
function2
function3
中分配了任何对象,但没有自动释放,则这些对象的内存将泄漏。启用“完全异常安全”的ARC能够检测这些情况并适当地处理它们,但这仅适用于您自己代码中的对象,而不适用于您可以使用的外部库分配的任何内存。一般认为,您的应用程序不会从使用
@throw
引发的异常中恢复


查看更多详细信息。

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

@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{}
块中捕获此异常对象,或者如果忽略此异常对象,则会提醒操作系统关闭应用程序进程

必须抛出异常才能捕获

更多阅读苹果的文档(您应该会对这些文档感到满意):