在使用try进行错误处理的时候,经常会看到try后面跟有问号(?)或感叹号(!),他们有什么区别呢?

1.使用try? 

try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。

示例代码如下:

  1. //查询所有数据方法
  2. func findAll() throws -> [Note] {
  3. guard listData.count > 0 else {
  4. //抛出"没有数据"错误。
  5. throw DAOError.NoData
  6. }
  7. return listData
  8. }
  9. let datas  = try? findAll()
  10. print(datas)

上述代码中let datas = try? findAll()语句中使用了try?,datas是一个可选值,本例中输出nil。使用了try?语句没有必要使用do-catch语句将其包裹起来。

2.使用try!

使用try!可以打破错误传播链条。错误抛出后传播给它的调用者,这样就形成了一个传播链条,但有的时候确实不想让错误传播下去,可以使用try!语句。

修改上述代码如下:

  1. //查询所有数据方法
  2. func findAll() throws -> [Note] {
  3. guard listData.count > 0 else {
  4. //抛出"没有数据"错误。
  5. throw DAOError.NoData
  6. }
  7. return listData
  8. }
  9. func printNotes() {
  10. let datas  = try! findAll()       ①
  11. for note in datas {
  12. print("date : \(note.date!) - content: \(note.content!)")
  13. }
  14. }
  15. printNotes()                         ②

代码printNotes()函数没有声明抛出错误,在调用它的时候不需要try关键字,错误传播链条在printNotes()函数内被打破了。

代码将try dao.findAll()语句改为try! findAll(),在try后面加了感叹号(!),这样编译器就不会要求printNotes()方法声明抛出错误了,try!打破了错误传播链条,但是如果真的发生错误就出现运行期错误,导致程序的崩溃。

所以使用try!打破错误传播链条时,应该确保程序不会发生错误。

Swift—使用try?和try!区别-备的更多相关文章

  1. Swift类和结构体定义-备

    Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...

  2. Swift— Swift编码规范之命名规范-备

    程序代码中到处都是自己定义的名字,取一个有样并且符合规范的名字非常重要. 命名方法很多,但是比较有名的,广泛接受命名法有: 匈牙利命名,一般只是命名变量,原则是:变量名=类型前缀+描述,如bFoo表示 ...

  3. Swift —构造函数与存储属性初始化-备

    构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和height后,那么在定义他们时就不需要初始化了. ...

  4. Swift - String与NSString的区别,以及各自的使用场景

    String是Swift里新增加的类型,它与原来的NSString可以很方便地互相转换.但在实际开发中,我们该如何选择? 1,能使用String类型就尽量使用String类型,原因如下: (1)现在C ...

  5. Swift—使用try?和try!区别-仅供参考

    在使用try进行错误处理的时候,经常会看到try后面跟有问号(?)或感叹号(!),他们有什么区别呢? 1.使用try?  try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方 ...

  6. Swift互用性:与 Objective-C 的 API 交互(Swift 2.0版更新)-备

    本页包含内容: 初始化 可失败初始化 访问属性 方法 id 兼容性(id Compatibility) 空值和可选值 扩展(Extensions) 闭包(Closures) 比较对象 Swift 类型 ...

  7. Swift - AnyObject与Any的区别

    1,AnyObject :代表任何class类型的对象实例. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Man{ }   class Woman{ ...

  8. OC与Swift的区别三(条件语句)

    11.swift中的switch结构 区别一: oc中switch条件只可以放整数 swift中switch条件可以放几乎任何数据类型 区别二: oc中每一个case中应有break,如果没有brea ...

  9. iOS开发Swift篇—(六)流程控制

    iOS开发Swift篇—(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...

随机推荐

  1. windows7中的“mklink命令” 转

    从 Vista 以后,微软将用户文件和用户的软件配置( AppData ) 明确划分开,并且全部存放在使用者的用户目录下. Linux早已这样做了,并且在Linux中可将 home 挂载为独立分区,而 ...

  2. ubuntu下QT输出程序控制台界面难看的解决方法

    这几天在ubuntu下装了QT5,但输出程序界面后,简直无法入目 于是,随便乱找后,终于找到解决方法 打开选项 在终端那行改下就行

  3. 怎么都没人提 google 加密搜索呢? google如何稳定打开

    1. 使用smarthosts提供的hosts文件 https://smarthosts.googlecode.com/svn/trunk/hosts2. 修改浏览器默认搜索引擎为 https://e ...

  4. Spark on YARN的两种运行模式

    Spark on YARN有两种运行模式,如下 1.yarn-cluster:适合于生产环境.        Spark的Driver运行在ApplicationMaster中,它负责向YARN Re ...

  5. 修改ORACLE的语言参数

    ALTER SYSTEM SET nls_territory = "CHINA" SCOPE=SPFILE; ALTER SYSTEM SET NLS_CURRENCY = '¥' ...

  6. int.Parse()与int.TryParse()

      int i = -1;bool b = int.TryParse(null, out i);执行完毕后,b等于false,i等于0,而不是等于-1,切记. int i = -1;bool b = ...

  7. AngularJS - 基本功能介绍

    转载自:http://www.cnblogs.com/powertoolsteam/p/angularjs-introdection.html (写得很好的Angular入门,可以试试) Angula ...

  8. linux vim 个性化设置(.vimrc)

    set sw=4   set ts=4   set et   set smarttab   set smartindent   set lbr   set fo+=mB   set sm   set ...

  9. 阻塞机制下的recv小结

    recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结.      首先阻塞 ...

  10. ajax_get方式

    test_ajax_get.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...