面试题答案
一键面试@try
、@catch
、@finally
异常处理
- 基本语法
@try { // 可能会抛出异常的代码块 // 例如: NSString *str = nil; NSInteger length = [str length]; // 这里会抛出异常,因为str为nil } @catch (NSException *exception) { // 捕获异常后执行的代码块 NSLog(@"捕获到异常: %@", exception); } @finally { // 无论是否发生异常,最终都会执行的代码块 NSLog(@"finally 代码块执行"); }
- 执行逻辑
@try
块:程序进入@try
块后,开始执行其中的代码。如果在执行过程中没有发生异常,那么@try
块执行完毕后,会跳过@catch
块,直接执行@finally
块。@catch
块:当@try
块中抛出异常时,程序会立即跳转到@catch
块,@catch
块捕获并处理该异常。@catch
块参数NSException *exception
包含了异常的详细信息,如异常名称、原因等。@finally
块:无论@try
块中是否发生异常,也无论@catch
块是否捕获并处理了异常,@finally
块中的代码最终都会被执行。
使用 NSError
进行错误传递和处理
- 定义方法时声明
NSError **
参数- (BOOL)readDataFromFile:(NSString *)fileName error:(NSError **)error { NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:fileName]) { if (error) { NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"文件不存在"}; *error = [NSError errorWithDomain:@"com.example.error" code:1001 userInfo:userInfo]; } return NO; } // 其他读取文件数据的代码 return YES; }
- 调用方法并处理错误
NSError *error = nil; BOOL success = [self readDataFromFile:@"nonexistentFile.txt" error:&error]; if (!success) { NSLog(@"读取文件失败: %@", error); // 根据错误情况进行相应处理,例如提示用户、重试等 } else { NSLog(@"文件读取成功"); }
- 错误传递
- 在方法内部,如果发生错误,并且方法需要将错误信息传递给调用者,就可以通过
NSError **
参数来设置错误信息。 - 调用者在调用方法时,传入一个
NSError *
变量的地址,方法执行过程中如果发生错误,就会在该变量中设置错误信息,调用者通过检查这个变量是否为nil
来判断方法是否执行成功,若不为nil
则可以获取详细的错误信息进行处理。
- 在方法内部,如果发生错误,并且方法需要将错误信息传递给调用者,就可以通过