iOS之try异常捕捉和自定义异常类的使用

1、实例

假设我们定义了一个协议FKEatable,使用FKApple类继承FKEatable协议,但是不实现FKEatable的方法,但是在测试代码中定义了FKApple类,并调用协议的方法,此时就会报错如下

#import "FKApple.h"

int main(int argc , char * argv[])
{
	@autoreleasepool{
		@try
		{
			// 创建FKApple对象
			FKApple* app = [[FKApple alloc] init];
			// 调用taste方法
			[app taste];
		}
		@catch(NSException* ex)
		{
			NSLog(@"==捕捉异常==");
			NSLog(@"捕捉异常:%@,%@" , ex.name , ex.reason);
		}
		@finally
		{
			// 此处可进行资源回收等操作
			NSLog(@"资源回收!");
		}
		NSLog(@"程序执行完成!");
	}
}
2、分析

1)try:必须存在,必须使用{},且try中定义的变量在catch中不能使用,一般情况下,try执行一次,只能获取一条catch异常

2)catch:可以有多个catch块,跟在try后面。catch俘获异常对象,异常对象包括:name:返回异常详细名称,reason:返回异常引发原因,userInfo:返回引发异常的用户附加信息,返回值是一个NSDictionary对象

3)finally:回收资源,只要存在,就会执行finally内的语句,不能在该块中使用return或@throw语句,这将会导致try和catch语句中的return和throw语句失效。


自定义异常类

1、@throw

在程序中需要自行抛出异常的时候,应该使用@throw语句,@throw语句可以单独使用,它抛出的不是异常类,而是一个异常实例,而且每次都只能抛出一个异常实例。语法格式如下:

@throw   ExceptionInstance

大部分时候可以直接抛出NSException对象即可,少数情况下Object-C也可以抛出自定义异常。如下代码:

1)自定义异常类FKMyException

//.h
#import <Foundation/Foundation.h>

// 定义类的接口部分
@interface FKMyException : NSException
@end


//.m
#import "FKMyException.h"

// 为FKMyException提供实现部分
@implementation FKMyException
@end
2)测试类FKGog

//.h
#import <Foundation/Foundation.h>

// 定义类的接口部分
@interface FKDog : NSObject
@property (nonatomic , assign) int age;
@end


//.m
#import "FKDog.h"
#import "FKMyException.h"

// 为FKDog提供实现部分
@implementation FKDog
@synthesize age = _age;
- (void) setAge:(int)age
{
	if(self.age != age)
	{
		// 检查年龄是否在0~50之间
		if(age > 50 || age < 0)
		{
			// 手动抛出异常
			@throw [[FKMyException alloc] 
				initWithName:@"IllegalArgumentException"
				reason:@"狗的年龄必须在0~50之间"
				userInfo:nil];
		}
		_age = age;
	}
}
@end
3)测试代码

#import "FKDog.h"
#import "FKMyException.h"

int main(int argc , char * argv[])
{
	@autoreleasepool{
		// 创建FKDog对象
		FKDog* dog = [[FKDog alloc] init];
		dog.age = 20;
		NSLog(@"狗的年龄为:%d" , dog.age);
		dog.age = 80;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值