Swift小知识点之try try! try?使用和区别

  • OC中的catch捕捉

    • 使用NSAssert(断言)不符合条件的主动崩溃

      - (void)check:(NSString *)name age:(NSInteger)age{
          NSAssert(name.length>0, @"name is nil");
          NSAssert(age>0 && age<120, @"age is outof rang 0...120");
      }
    • 还有另外一种被动报错,可以捕捉到catch中的

      @try {
          NSArray *list = @[];
          list[2];
      } @catch (NSException *exception) {
          //这里报错才会执行
          NSLog(@"%@",exception.description);
      } @finally {
          //这里一定会执行
      }

      实际输出是:但是不会崩溃。

       *** -[__NSArray0 objectAtIndex:]: index 2 beyond bounds for empty NSArray
  • Swift中的catch捕捉

    swift异常处理 历史由来

    Swift1.0版本 Cocoa Touch 的 NSError ,Swift并没有真正的具备自己的异常处理机制

    Swift2.0版本 加入 ErrorType protocol

    Swift3.0版本 改名 Error protocol

    Swift3.0 Error protocol 的使用

      首先定义一个枚举,集成协议Error (Swift 2.0 的协议叫做ErrorType,3.0后协议改名Error)

    enum MyError : Error {
      case one
      case two
      case three
    }
    • throws和throw的使用

      使用throws放在参数列表后面标明一个方法有异常抛出,标准格式 : 

      func 方法名字 (参数列表) throws -> 返回值类型 并在方法内使用throw抛出异常
      func testFunc(str: String) throws -> String {
        if str == "one" {
        throw MyError.one
      } else if str == "two" {
        throw MyError.two
      } else if str == "three" {
        throw MyError.three
      }
        return "ok"
      }
    • 使用do-catch处理异常

      do {
        var str = try testFunc(str: "three")
      } catch MyError.one {
        print("MyError.one")
      } catch MyError.two {
        print("MyError.two")
      } catch let error as MyError {
        print(error)
      }
    • try?的使用

      Swift2.0 后加入了新的关键字 try? , 如果不想处理异常那么可以用这个关键字,使用这个关键字返回一个可选值类型,如果有异常出现,返回nil.如果没有异常,则返回可选值.例子如下

      func testFunc(str: String) throws -> String {
      if str == "one" {
        throw MyError.one
      }else if str == "two" {
        throw MyError.two
      }else if str == "three" {
        throw MyError.three
      }
        return "ok"
      }
      var str = try? testFunc(str: "three")
      print(str)

      控制台输出 

      `nil
      Program ended with exit code: 0`
    • try!的使用

      如果不想处理异常,而且不想让异常继续传播下去,可以使用try!.这有点儿类似NSAssert().但是一旦使用try!后,在可能抛出异常的方法中抛出了异常,那么程序会立刻停止.例子如下

      func testFunc(str: String) throws -> String {
      if str == "one" {
        throw MyError.one
      }else if str == "two" {
        throw MyError.two
      }else if str == "three" {
        throw MyError.three
      }
        return "ok"
      }
      var str = try! testFunc(str: "three")

      控制台:程序奔溃掉~

    • try try? try! 的区别

      try    出现异常处理异常
      try?  不处理异常,返回一个可选值类型,出现异常返回nil
      try!   不让异常继续传播,一旦出现异常程序停止,类似NSAssert()


posted on 2021-07-12 18:01  梁飞宇  阅读(1078)  评论(0)    收藏  举报