@throw没有被@catch阻止?

时间:2016-05-20 07:27:15

标签: objective-c try-catch nsexception

如果有一个类似

的代码
@try
{
    @throw [NSException new];
}
@catch (NSException ex)
{
    NSLog(@"exception caught");
}

在这种情况下,代码不会转到@catch块,而是应用程序崩溃。我们应该如何在objective-c

中捕获@throw引发的异常抛出

2 个答案:

答案 0 :(得分:3)

[NSException new]实例化null类,因为它不包含任何有用的信息。它生成NSException实例,因此您的:

@catch (NSException *ex)
{
    NSLog(@"exception caught");
}

没用。但是,如果您使用:

@catch (id exception)
{

}

你会抓住这个空对象。

摘自Handling Exceptions的官方文件:

  

您可以拥有一系列@catch错误处理块。每个街区   处理不同类型的异常对象。你应该订购这个   @catch块序列从最具体到最不具体   异常对象的类型(最不具体的类型是id)...

答案 1 :(得分:1)

您必须使用

初始化NSException

@throw [NSException exceptionWithName:@"Exception!" reason:nil userInfo:nil];

或在Apple文档中的“创建和引发NSException对象”页面中列出的构造NSException的其他一些有效方法。 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSException_Class/index.html#//apple_ref/occ/cl/NSException