《从零开始学Swift》学习笔记(Day 55)——使用try?和try!区别
原创文章,欢迎转载。转载请注明:关东升的博客
在使用try进行错误处理的时候,经常会看到try后面跟有问号(?)或感叹号(!),他们有什么区别呢?
1.使用try?
try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。
示例代码如下:
//查询所有数据方法
func findAll() throws-> [Note] {guard listData.count > 0 else {//抛出"没有数据"错误。throw DAOError.NoData}return listData
}let datas = try? findAll() print(datas)
上述代码中let datas = try? findAll()语句中使用了try?,datas是一个可选值,本例中输出nil。使用了try?语句没有必要使用do-catch语句将其包裹起来。
2.使用try!
使用try!可以打破错误传播链条。错误抛出后传播给它的调用者,这样就形成了一个传播链条,但有的时候确实不想让错误传播下去,可以使用try!语句。
修改上述代码如下:
//查询所有数据方法
func findAll() throws-> [Note] {guard listData.count > 0 else {//抛出"没有数据"错误。throw DAOError.NoData}return listData
}func printNotes() {let datas = try! findAll() ①for note in datas {print("date : \(note.date!) -content: \(note.content!)")}
}
printNotes()
②
代码printNotes()函数没有声明抛出错误,在调用它的时候不需要try关键字,错误传播链条在printNotes()函数内被打破了。
代码将try dao.findAll()语句改为try! findAll(),在try后面加了感叹号(!),这样编译器就不会要求printNotes()方法声明抛出错误了,try!打破了错误传播链条,但是如果真的发生错误就出现运行期错误,导致程序的崩溃。
所以使用try!打破错误传播链条时,应该确保程序不会发生错误。
欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php
转载于:https://blog.51cto.com/tonyguan/1748320
《从零开始学Swift》学习笔记(Day 55)——使用try?和try!区别相关推荐
- 从零开始学STM32(学习笔记——第三天)
CSDN话题挑战赛第2期 参赛话题:学习笔记 参考文章: [教学文章]STM32内部重要功能全记录 [教学文章]STM32内部核心功能大揭秘 [教学文章]STM32内部重要功能全记录 框架:STM32 ...
- 【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一
本笔记由学习MLIR Tutorials总结而成,欢迎批评指正. Chapter1: Toy语言和AST MLIR提供了一种Toy语言来说明MLIR的定义和执行的流程.Toy语言是一种基于张量的语言, ...
- 关东升的《从零开始学Swift》
这个博文是swift 2.0的,也是可以参考的 http://blog.csdn.net/tonny_guan/article/category/6139217 文章目录 [置顶] 关东升的<从 ...
- 关东升的《从零开始学Swift》即将出版
大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift><从零开始学Swift>将在< ...
- 百度计算广告学沙龙学习笔记 - 内容匹配广告
百度计算广告学沙龙学习笔记 - 内容匹配广告 时间 2014-02-05 18:53:55 CSDN博客 原文 http://blog.csdn.net/three_body/article/det ...
- 【从零开始学深度学习编译器】十三,如何在MLIR里面写Pass?
[GiantPandaCV导语]这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容.这里主要讲解了如何在MLIR中自定义Pass ...
- 动手学深度学习笔记3.4+3.5+3.6+3.7
系列文章目录 动手学深度学习笔记系列: 动手学深度学习笔记3.1+3.2+3.3 文章目录 系列文章目录 前言 一.softmax回归 1.1 分类问题 1.2 网络架构 1.3 全连接层的参数开销 ...
- 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.
作者:北欧森林 链接:https://www.jianshu.com/p/f09d0f97592f 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(43)主要 ...
- 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.
作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...
- 影像组学视频学习笔记(41)-如何使用软件提取组学特征、Li‘s have a solution and plan.
作者:北欧森林 链接:https://www.jianshu.com/p/72186eb3e395 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(41)主要 ...
最新文章
- 国际大师Stan Lippman访华布道C++技术大会
- 多个SSH Key自动化配置
- Linux知识积累(6) 系统目录及其用途
- 《Create Your Successful Agile Project》书评与作者访谈
- 如何应用Java的可变参数
- [css] 如何自定义radio按钮的样式
- 电工结业试卷_电工技术基础结业考试试卷
- matlab实现层次分析法
- 全国计算机棋类竞赛,自主招生认可的12类主流竞赛详解
- 【Flink】 producer attempted to use a producer id which is not currently assigned to its transaction
- 互联网之“死”:为什么开发者会排斥新技术?
- EasyRecovery软件帮你快速恢复图片数据
- 马什么梅?I什么N?浅谈 web 前端开发中的国际化
- 计算机网络课程设计小型企业局域网的组建,计算机网络课程设计小型企业局域网的组建.doc...
- 智牛股_第6章_Mybatis Generator代码生成器
- angular项目如何配置国际化(i18n)?
- 关于Andorid加载高清大图(仿sina weibo 里面的长图效果)
- perforce(p4)相关问题
- 二分法中 mid=beg+(end-beg)/2 与 mid=(beg+end)/2 的区别?
- 高频交易系统性能应该从哪些方面优化?
热门文章
- angular大型项目实践总结的几个要点
- 开发工具链(国内项目)(持续更)
- c++中的类型转换--reinterpret_cast
- 机器学习:随机森林RF-OOB袋外错误率
- redis缓存实现原理php,分析redis原理及实现
- windows下可用mysql吗_Windows下MySQL安装配置与使用
- SpringBoot开发案例之CountDownLatch多任务并行处理
- 自适应滤波:最小均方误差滤波器(LMS、NLMS)
- Red Hat Enterprise MRG 2.0 Installation And Configuration Guide
- Cannot resolve field [content], input field list:[contents].