Object-C异常机制

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;
      }
}

当程序执行@try块,@catch块时遇到了return语句或@throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含@finally块,如果没有@finally块,程序立即执行return语句或@throw语句,方法终止。如果有@finally块,系统立即开始执行@finally块--只有当@finally块执行完成后,系统才会再次跳回来执行@try块,@catch块里的return或@throw语句,如果@finally块里也使用了return或@throw等导致方法终止的语句,则@finally块已经终止了方法,系统将不会跳回去执行@try块,@catch块里的任何代码。
尽量避免在@finally中使用return或@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];
      }
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值