面试题答案
一键面试- 捕获并区分异常:
在Objective - C中,
@catch
块可以通过捕获异常对象,并检查异常对象的类型来区分不同类型的异常。例如:@try { @try { // 这里可能抛出NSRangeException或NSInvalidArgumentException异常 // 比如可能的代码: NSArray *array = @[@1, @2]; id object = [array objectAtIndex:10]; // 可能抛出NSRangeException // 或者 [NSNumber numberWithInt:@"not an int"]; // 可能抛出NSInvalidArgumentException } @catch (NSException *exception) { if ([exception isKindOfClass:[NSRangeException class]]) { // 处理NSRangeException异常 NSLog(@"捕获到NSRangeException异常: %@", exception); } else if ([exception isKindOfClass:[NSInvalidArgumentException class]]) { // 处理NSInvalidArgumentException异常 NSLog(@"捕获到NSInvalidArgumentException异常: %@", exception); } } @finally { NSLog(@"内层@finally块执行"); } } @catch (NSException *exception) { // 这里外层@catch也可以捕获到内层抛出且未处理的异常 if ([exception isKindOfClass:[NSRangeException class]]) { NSLog(@"外层捕获到NSRangeException异常: %@", exception); } else if ([exception isKindOfClass:[NSInvalidArgumentException class]]) { NSLog(@"外层捕获到NSInvalidArgumentException异常: %@", exception); } } @finally { NSLog(@"外层@finally块执行"); }
- @finally块的执行顺序:
- 当内层
@try
块抛出异常时,首先会执行内层的@finally
块。 - 然后异常会传递到外层
@catch
块(如果内层@catch
块没有处理该异常),如果外层@catch
块捕获并处理了异常,最后会执行外层的@finally
块。 - 如果内层
@catch
块处理了异常,不会再传递到外层@catch
块,但内层@finally
块执行完毕后,程序会继续执行内层@finally
块之后的代码,而外层@finally
块不会因为内层异常被处理而执行(除非外层@try
块本身也抛出异常)。
- 当内层
总之,@finally
块的执行顺序是:内层@finally
块先执行,然后根据异常是否被处理以及是否传递到外层,决定外层@finally
块是否执行。