MST

星途 面试题库

面试题:Objective-C异常处理的嵌套与异常类型

在Objective-C中,若存在多层@try - @catch - @finally嵌套结构,且内层@try抛出不同类型的异常(如NSRangeException和NSInvalidArgumentException),请详细说明外层@catch如何捕获并区分处理这些不同类型的异常,同时说明在整个嵌套结构中@finally块的执行顺序。
36.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 捕获并区分异常: 在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块执行");
    }
    
  2. @finally块的执行顺序
    • 当内层@try块抛出异常时,首先会执行内层的@finally块。
    • 然后异常会传递到外层@catch块(如果内层@catch块没有处理该异常),如果外层@catch块捕获并处理了异常,最后会执行外层的@finally块。
    • 如果内层@catch块处理了异常,不会再传递到外层@catch块,但内层@finally块执行完毕后,程序会继续执行内层@finally块之后的代码,而外层@finally块不会因为内层异常被处理而执行(除非外层@try块本身也抛出异常)。

总之,@finally块的执行顺序是:内层@finally块先执行,然后根据异常是否被处理以及是否传递到外层,决定外层@finally块是否执行。