• objective-c(十一)关于错误处理


      在objective-c中,有3种对于错误处理的方式。

      一.使用返回值进行返回错误状态

      在许多编程语言中,都有方法的概念。方法可以有返回值类型来规定返回的类型。在返回时可以通过自定义的约定来返回相应的错误代码或者错误状态。

      二.使用NSException类。

      在objective-c中,也存在异常类。这个类的使用首先通过判断来设置错误的类型。然后通过@throw标签类抛出异常。

      NSException *ex = [NSException exceptionWithName:@"test" reason:@"没有理由" userInfo:nil];

      @throw ex;

      这样就抛出了异常。之后再通过使用@try @catch标签来捕获异常

      @try{

        somecode;

      }@catch(Exception sometype){

        somecode;

      }@finally{

        somecode;

      }

      通过于java类似的方法进行捕获异常。

      同时在sometype的地方。可以使用自定义的类型。这个类型只要继承Exception类就好。然后抛出异常时抛出的也是自定义的异常。

      三.使用NSError对象

      NSError对象是通过返回正常的类型。但是NSError对象类似一个中转变量,通过传入参数来对NSError对象赋值。最后通过返回值判断值类型来判断是否处理异常以及异常的状态

      使用NSError的对象时。就不需要使用@try,@catch等标签,有点类似于在java中使用一个封装好了的json数据。

      使用代码如下:  

      -(BOOL) check:(NSError **) outError{

        NSDictionary *dic = [NSDictionary dictionaryWithObject:@"错误信息" forkey:NSLocalizedDescriptionKey]:

        if(code){

          *outError = [NSError errorWithDomain:@"错误类型" code:404 userInfo:dic];

          return NO;

        }

        return YES;

      }

      以上代码就是关于NSError的内部设置。这里面有两个知识点:

      1.是关于(NSError **)间接引用。理论上是指针的指针。首先是传进来的变量是一个指针,而指针的所指向是另一个指针。所以这样通过参数传进来,就可以在函数内部进行改变内存变量的改变。并且间接的延长了变量的作用域。

      2.是关于NSDictionary,关于这个数据字典的forkey其实是可以使用普通字符串的。但是可能会导致变量获取时的不一致,因此推荐使用全局的错误变量key。如:NSLocalizedDescriptionKey

      在真正调用时代码如下:

      int main{

        NSError *outError = nil;

        类名 *对象名 = [[类名 alloc]init];//初始化对象

        BOOL flag = [ 对象名 check:&outError];//开始校验

        if(flag){

          int codeNum = [outError code];//获取错误码

          NSString mode = [outError domain];//获取错误模块名

          NSString errorInfo = [[outError userInfo]objectForKey:NSLocalizedDescriptionKey];//获取错误信息

        }

        return 0;

      }

      以上就是调用信息。因为NSError比前面两种都更灵活。一般情况下建议使用NSError,但是在某些情况下NSException对于结局崩溃问题有奇效。因此灵活使用。

  • 相关阅读:
    【MYSQL】某些有用的sql【持续更新中】
    【LDAP】什么时候需要使用LDAP?
    【LDAP】 objectClass 分类
    MySQL的锁机制
    spring的事务传播级别及场景
    @NotEmpty,@NotNull和@NotBlank的区别
    mysql的字段为bit时,插入数据报Data too long
    activeMQ启动报--找不到或无法加载主类
    【ListViewJson】【com.demo.app】【AppException】源码分析及其在工程中作用
    【ListViewJson】【com.demo.app】【AppConfig】源码分析及其在工程中作用
  • 原文地址:https://www.cnblogs.com/imtodd/p/6690227.html
Copyright © 2020-2023  润新知