Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 418|回复: 0

Swift异常处理的try?与try!

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-27 13:24:40 | 显示全部楼层 |阅读模式

    首先要明白抛出异常后异常的运动:异常被抛出后,中断整个处理,异常不断向外层(范围)传递,直到遇到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!,后期容易出问题

     

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-11 15:54 , Processed in 0.067553 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表