@try @catch @finally

学习笔记 比较基础

基本概念

Try
Try

@try @catchObjective-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");
   }

求知若饥 虚心若愚
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容