学习笔记 比较基础
基本概念
@try
@catch
是Objective-C
异常捕捉机制
* `@try`存放可能出现异常的代码 - 发现异常
* `@catch`异常处理逻辑 - 捕捉异常 && 处理异常
* `@finally`回收资源 -- 执行收尾
在我们编写Objective-C程序时,最好的编程实践是指能预测程序中可能出现的问题。为此,你可以测试使程序异常终止的条件并处理这些情况,可能要记录一条消息并完全终止程序,或者采取其他正确措施。以避免错误为例,在程序运行时执行测试可以避免向对象发送未识别的消息。当试图发送这类未识别消息时,程序通常会立即终止并抛出一个异常。
___Objective-C中使用@try处理异常
测试总结
void(^_asect)(NSString *str) = ^(NSString *str){
NSCAssert(NO, str);
};
static inline void catchexception(NSString *str){
NSCAssert(NO, str);
}
NSArray *arr = nil;
@try {
NSDictionary *dic = @{arr:arr};
NSLog( @"%@", dic);
}@catch (NSString *exception) {
NSLog(@"@exception11111");
NSLog( @"异常:%@", exception);
}@catch(NSException *exception){
NSLog(@"@exception22222");
catchexception(exception.reason);
}@catch(NSException *exception){
NSLog(@"@exception33333");
_asect(exception.reason);
}@finally {
NSLog(@"@finally");
}
NSLog(@"@finally44444");
-
@try产生异常时
会在之后的@catch中捕捉异常,如果异常类型和@catch的参数类型相符,就会执行@catch中的代码;如果异常类型和@catch的参数类型不相符,就会执行后面的@catch知道异常类型匹配/如果类型都不匹配,所有@catch中的代码都不会执行;最后执行@finally
如果在执行@catch和异常类型匹配,就会执行@catch中的代码;如果@catch中代码也存在异常,异常之后的代码不再执行;最后执行@finally
多个@catch存在时 ,异常只会在首个&&异常匹配的@catch 中执行, 之后的@catch不再执行;最后执行@finally
@try不产生异常时
只会执行@try中的代码和@finally中的代码
@finally代码块一定执行
如果@finally执行代码中出现异常, 异常之后的代码不再执行
@finally之外的代码
在异常正常捕捉并且@catch和之后执行的@finally中的执行代码不存在异常的情况下会执行
@catch 和 @finally代码块执行时出现的异常
这些异常会被返回给方法的调用者
补充_NSException
NSException 是 OC 中所有异常的父类
主要属性
@property (readonly, copy) NSExceptionName name;
@property (nullable, readonly, copy) NSString *reason;
@property (nullable, readonly, copy) NSDictionary *userInfo;
- @catch 代码块捕获异常时查看 异常对象类型是否是 捕获的异常类型 或者其子类, 一旦放在开头, 后面的异常永远不可能捕获;
eg:
NSArray *arr = nil;
@try {
NSDictionary *dic = @{arr:arr};
NSLog( @"%@", dic);
} @catch (NSException *exception) {//执行
NSLog( @"异常:%@", exception.name);
}@catch(NSException *exception){//不执行
catchexception(exception.reason);
}@catch(NSException *exception){//不执行
_asect(exception.reason);
}@finally {
NSLog(@"@finally");
}