OC中捕捉异常
你会发现在OC中很少像其他语言那样频繁使用异常处理。然而,try/catch/finally block 可以用来捕获那些导致app发生的错误。
在以下例子中,创建里一个array,然而没有添加任何元素。在try块中试图去访问array的第一个元素会导致异常并抛出。
NSArray* arraytest = [[NSArray alloc] init];
@try
{
// Attempt access to an empty array
NSLog(@"Object: %@", [arraytest objectAtIndex:0]);
}
@catch (NSException *exception)
{
// Print exception information
NSLog( @"NSException caught" );
NSLog( @"Name: %@", exception.name);
NSLog( @"Reason: %@", exception.reason );
return;
}
@finally
{
// Cleanup, in both success and fail cases
NSLog( @"In finally block");
[arraytest release];
}
代码运行输出如下:
iPhoneApp[4464:b903] NSException caught
iPhoneApp[4464:b903] Name: NSRangeException
iPhoneApp[4464:b903] Reason: *** -[NSArray objectAtIndex:]: index 0 beyond bounds for empty array
iPhoneApp[4508:b903] In finally block
无论@try块是否发生异常,@finally中的代码都会被执行,这里是执行清理工作相关代码的最好地方。
在处理文件相关操作(如NSFileHandleOperationException)时,使用exceptions非常有用。
捕获一个特定异常
像上面的例子中一样使用NSException
会捕获所有异常。你也可以只关注某一类异常。如下所示:只关注NSRangeException
@try
{
// Attempt access to an empty array
NSLog(@"Object: %@", [arraytest objectAtIndex:0]);
}
@catch (NSRangeException *exception)
{
// Print exception information
NSLog( @"NSRangeException caught" );
NSLog( @"Reason: %@", exception.reason );
return;
}
@finally
{
// Cleanup, in both success and fail cases
NSLog( @"In finally block");
[arraytest release];
}
抛出异常
你也可以在一个方法中抛出异常,如下所示testException始终会抛出一个异常
- (void)testException
{
if (1 == 1)
{
NSException *exception = [NSException exceptionWithName: @"Exception!"
reason: @"Something not so good occurred."
userInfo: nil];
@throw exception;
}
}
使用try/catch/finally将testException进行包裹调用。如下
@try
{
// Call the method...
[self testException];
}
@catch (NSException *exception)
{
// Print exception information
NSLog( @"NSException caught" );
NSLog( @"Name: %@", exception.name);
NSLog( @"Reason: %@", exception.reason );
return;
}
@finally
{
NSLog( @"In finally block");
}
输出如下:
iPhoneApp[4660:b903] NSException caught
iPhoneApp[4660:b903] Name: Exception!
iPhoneApp[4660:b903] Reason: Something not so good occurred.
iPhoneApp[4660:b903] In finally block