原创文章,欢迎转载。转载请注明:关东升的博客

在使用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!区别相关推荐

  1. 从零开始学STM32(学习笔记——第三天)

    CSDN话题挑战赛第2期 参赛话题:学习笔记 参考文章: [教学文章]STM32内部重要功能全记录 [教学文章]STM32内部核心功能大揭秘 [教学文章]STM32内部重要功能全记录 框架:STM32 ...

  2. 【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一

    本笔记由学习MLIR Tutorials总结而成,欢迎批评指正. Chapter1: Toy语言和AST MLIR提供了一种Toy语言来说明MLIR的定义和执行的流程.Toy语言是一种基于张量的语言, ...

  3. 关东升的《从零开始学Swift》

    这个博文是swift 2.0的,也是可以参考的 http://blog.csdn.net/tonny_guan/article/category/6139217 文章目录 [置顶] 关东升的<从 ...

  4. 关东升的《从零开始学Swift》即将出版

    大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift><从零开始学Swift>将在< ...

  5. 百度计算广告学沙龙学习笔记 - 内容匹配广告

    百度计算广告学沙龙学习笔记 - 内容匹配广告 时间 2014-02-05 18:53:55 CSDN博客 原文  http://blog.csdn.net/three_body/article/det ...

  6. 【从零开始学深度学习编译器】十三,如何在MLIR里面写Pass?

    [GiantPandaCV导语]这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容.这里主要讲解了如何在MLIR中自定义Pass ...

  7. 动手学深度学习笔记3.4+3.5+3.6+3.7

    系列文章目录 动手学深度学习笔记系列: 动手学深度学习笔记3.1+3.2+3.3 文章目录 系列文章目录 前言 一.softmax回归 1.1 分类问题 1.2 网络架构 1.3 全连接层的参数开销 ...

  8. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f09d0f97592f 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(43)主要 ...

  9. 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...

  10. 影像组学视频学习笔记(41)-如何使用软件提取组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/72186eb3e395 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(41)主要 ...

最新文章

  1. 国际大师Stan Lippman访华布道C++技术大会
  2. 多个SSH Key自动化配置
  3. Linux知识积累(6) 系统目录及其用途
  4. 《Create Your Successful Agile Project》书评与作者访谈
  5. 如何应用Java的可变参数
  6. [css] 如何自定义radio按钮的样式
  7. 电工结业试卷_电工技术基础结业考试试卷
  8. matlab实现层次分析法
  9. 全国计算机棋类竞赛,自主招生认可的12类主流竞赛详解
  10. 【Flink】 producer attempted to use a producer id which is not currently assigned to its transaction
  11. 互联网之“死”:为什么开发者会排斥新技术?
  12. EasyRecovery软件帮你快速恢复图片数据
  13. 马什么梅?I什么N?浅谈 web 前端开发中的国际化
  14. 计算机网络课程设计小型企业局域网的组建,计算机网络课程设计小型企业局域网的组建.doc...
  15. 智牛股_第6章_Mybatis Generator代码生成器
  16. angular项目如何配置国际化(i18n)?
  17. 关于Andorid加载高清大图(仿sina weibo 里面的长图效果)
  18. perforce(p4)相关问题
  19. 二分法中 mid=beg+(end-beg)/2 与 mid=(beg+end)/2 的区别?
  20. 高频交易系统性能应该从哪些方面优化?

热门文章

  1. angular大型项目实践总结的几个要点
  2. 开发工具链(国内项目)(持续更)
  3. c++中的类型转换--reinterpret_cast
  4. 机器学习:随机森林RF-OOB袋外错误率
  5. redis缓存实现原理php,分析redis原理及实现
  6. windows下可用mysql吗_Windows下MySQL安装配置与使用
  7. SpringBoot开发案例之CountDownLatch多任务并行处理
  8. 自适应滤波:最小均方误差滤波器(LMS、NLMS)
  9. Red Hat Enterprise MRG 2.0 Installation And Configuration Guide
  10. Cannot resolve field [content], input field list:[contents].