OC中的异常一般是通过传递一个NSError的对象到方法中,如果方法执行错误会直接返回。并没有像JAVA一样大量使用Try catch进行异常的捕获。这是因为try catch无法捕获UncaughtException,而oc中大部分crash如:内存溢出、野指针等都是无法捕获的,而能捕获的只是像数组越界之类。所以try catch对于oc来说,比较鸡肋。虽说是鸡肋 但是我们在某些情况下还是有用的 这里简单介绍一下。
语法
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @try { } @catch (异常类型名1 ex) { } @catch (异常类型名2 ex) { }
@finally {
}
|
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| - (void)catchException { NSArray* array = [[NSArray alloc] init]; @try { NSLog(@"Object: %@", [array objectAtIndex:0]); } @catch (NSException *exception) { NSLog( @"NSException caught" ); NSLog( @"Name: %@", exception.name); NSLog( @"Reason: %@", exception.reason ); return; } @finally { NSLog( @"In finally block"); } }
|
输出结果:
1 2 3 4
| 2018-04-12 17:07:21.895703+0800 TryCatch_Demo[65406:18722039] NSException caught 2018-04-12 17:07:21.895808+0800 TryCatch_Demo[65406:18722039] Name: NSRangeException 2018-04-12 17:07:21.895889+0800 TryCatch_Demo[65406:18722039] Reason: *** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray 2018-04-12 17:07:21.895970+0800 TryCatch_Demo[65406:18722039] In finally block
|
总结
Apple虽然同时提供了错误处理(NSError)和异常处理(exception)两种机制,但是Apple更加提倡开发者使用NSError来处理程序运行中可恢复的错误。而异常被推荐用来处理不可恢复的错误。
参考文章
官方文档
Objective-C中try/catch/finally 使用
iOS @try @catch异常机制