Object-C异常机制
使用@try...@catch...@finally捕捉异常
Object-c异常处理机制的语法结构
@try
{
// 业务实现代码
...
}
@catch (异常1 ex)
{
// 异常处理代码
}
@catch (异常2 ex)
{
// 异常处理代码
...
}
// 可能更多的catch块
...
@finally
{
}
如果执行@try块里的业务逻辑代码时出现异常,系统将自动生成一个异常对象,抛出异常,由相应的@catch块捕获异常。
@try,@catch块后的花括号({...})不可以省略
当运行环境接受到异常对象时,会依次判断该异常对象是否是@catch块后异常类或其子类的实例。
NSException异常提供了异常类的根类。进行异常捕获是不仅应该把NSException对应的@catch块放在最后,所有父类异常的@catch块都应排在子类异常@catch块的后面。
先处理小异常,在处理大异常。
所有的异常对象都包含如下几个常用方法。
name:返回该异常详细的名称。
reason:返回引发该异常的原因。
userInfo:返回引发该异常的用户附加信息,该方法的返回值是一个NSDictionary对象。
NSLog(@"捕获异常:%@,%@", ex.name , ex.reason);
使用@finally回收资源
@finally块总会被执行。
BOOL test()
{
@try
{
// 因为finally块中包含了return语句,所以下面的return语句失去作用
}
@finally
{
return NO;
}
}
尽量避免在@finally中使用return或@throw。
抛出异常和自定义异常类
使用@throw抛出异常,如果需要在程序中自行抛出异常,应使用@throw语句,@throw语句可以单独使用,@throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例
使用@throw抛出异常,如果需要在程序中自行抛出异常,应使用@throw语句,@throw语句可以单独使用,@throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例
@throw ExceptionInstance;
// 定义类的接口部分
@interface MyException : NSException
@end
// 定义类的接口部分
@interface Dog : NSObject
@property (nonatomic , assign) int age;
@end
// Dog提供实现部分
@implementation Dog
@synthesize age = _age
-(void) setAge : (int) age
{
if (self.age != age)
{
// 手动抛出异常
@throw [[MyException alloc] initWithName : @"InlleagelaArgumentException" reason:@"" userInfo:nil];
}
}