Swift异常处理的try?与try!

首先要明白抛出异常后异常的运动:异常被抛出后,中断整个处理,异常不断向外层(范围)传递,直到遇到catch代码块群,会与catch代码块的条件进行匹配,匹配符合则进入此代码块处理。如果遇到没有条件的catch{}那么直接在这个代码里处理。如果抛出的异常一直到最外层仍没有被catch{}处理,那么程序会卡住(后面的处理全部中断)

举个简单的例子,异常和抛出异常的函数和之前博文里的是一样的

enum numTest: Int, Error  {

    case _0, _1, _2, _3

    case nothing = 999

}

func errorTest(by num: Int) throws -> String {

    switch num {

    case 0:

        throw numTest._0

    case 1:

        throw numTest._1

    case 2:

        throw numTest._2

    case 3:

        throw numTest._3

    case 10:

        throw numTest.nothing

    default:

        return "OK" + " \(num)"

    }

}

我们用这一段代码来测试

print("即将开始测试")

try errorTest(by: 0)

print("测试结束")

 

print("因为异常没有被捕捉,所以这两句话不会运行")

运行结果如下:

即将开始测试

 

换言之,如果我们抛出了异常,那就必须进行处理,不想处理?那么就加个空的无条件的catch{},为了方便观测效果,我们在catch里输出测试中

print("即将开始测试")

do {

    try errorTest(by: 0)

}catch {

    print("---测试中---")

}

print("测试结束")

 

print("因为异常被捕捉,所以这两句话会运行")

运行结果如下:

即将开始测试

---测试中---

测试结束

 

因为异常被捕捉,所以这两句话会运行

 

由以上测试可知,抛出的异常必须被处理,不然异常会导致程序中断,出现假死现象

可是,每次都要加上do-catch这一长串,无论是从代码的可读性还是写代码的角度都是非常不好的。这里,try?与try!就可以大显身手了

其实到这里,相信大家也很清楚try?和try!的作用了。

没错,try?是一个可选绑定,当后面运行的可以抛出异常的函数没有抛出异常,则直接运行。当抛出异常,则跳过此函数。既然是可选绑定,那么如果用在条件里,如果没抛出异常,那么返回的值带入声明量(void返回的是void的空值,不是nil),如果抛出,可选绑定判定为false,和普通的可选绑定一样

先看下面这个例子

print("即将开始测试")

try? errorTest(by: 0)

print("测试结束")

运行结果如下:

即将开始测试

测试结束

 

把try?改成try

print("即将开始测试")

try errorTest(by: 0)

 

print("测试结束")

运行结果如下:

 

即将开始测试

 

带入条件

for i in ..< 10 where i == 3 || i == 5 {

//for i in [3, 5] {

    print("即将开始测试")

    if let myTest = try? errorTest(by: i) {

        print("测试中,", terminator: "")

        print("没有抛出异常, 测试值\(myTest)")

    }else {

        print("测试中,", terminator: "")

        print("抛出异常")

    }

    print("测试结束")

    print("-----------") 

}

运行结果如下:

即将开始测试

测试中,抛出异常

测试结束

-----------

即将开始测试

测试中,没有抛出异常, 测试值OK 5

测试结束

-----------

 

最后再来看看try!,这个很明显了,就是默认不会抛出异常,直接运行,如果抛出运行在编译出错

print("即将开始测试")

print("正常值: ", try! errorTest(by: 6))

print("测试结束")

 

运行结果如下:

即将开始测试

正常值:  OK 6

测试结束

 

最后总结一下,try?和try!主要用在对异常抛出函数进行不需要捕捉异常的处理。当然,一般不建议用try!,后期容易出问题

 

 

 

posted @ 2017-04-02 18:22  懒虫哥哥  阅读(3616)  评论(0编辑  收藏  举报