ios异常处理之try-catch-finally

iOS优化

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)
{
//异常处理代码
}
// 可以捕捉 N 个 异常 ...
@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
{
// Attempt access to an empty array
NSLog(@"Object: %@", [array objectAtIndex:0]);

}
//虽然支持捕捉特定类型的NSException 但是 异常的类型确只有NSException这一种 奇怪
@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");

}
}

输出结果:

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异常机制