前言

  • 在 Swift 1.0 时代是没有异常处理和抛出机制的。

    • 如果要处理异常,要么使用 if else 语句或 switch 语句判断处理。
    • 要么使用闭包形式的回调函数处理。
    • 再要么就使用 NSError 处理。
  • 以上这些方法都不能像 Java 中的 try catch 异常控制语句那样行如流水、从容不迫的处理异常,而且也会降低代码的可读性。

  • 在 Swift 2.0 中 Apple 提供了使用 throwsthrowtrydocatch 这五个关键字组成的异常控制处理机制。

1、建造异常类型

  • 在 iOS 开发当中,我们会面对很多异常处理。

    • 在 Cocoa Touch 中使用 Error 来进行异常处理。
    • 从 Swift 2.0 开始,可以使用 Error protocol
  • 在 Swift 中,enum 是建立属于你自己的异常类型的最好的方法,你只要在你的 enum 中确认新的 Error

    enum MyError: Error {case notExistcase outOfRange
    }       
  • 在抛出异常之前,我们需要在函数或方法的返回箭头 -> 前使用 throws 关键字来标明将会抛出异常。

    // 有返回值,在 -> 前加 throws
    func myMethodRetrunString() throws -> String        // 声明将会抛出异常// 没有返回值,在方法末尾加 throws
    func myMethodRetrunNothing() throws                 // 声明将会抛出异常

2、抛出异常

  • 声明之后,在函数或者方法里使用 throw 关键字扔出异常,throw 之后的代码不会再被执行。

    func myMethodRetrunNothing() throws {// ...// item is an optional valueguard let item = item else {// need throws the error outthrow MyError.notExist                      // 抛出异常}// do with item
    }

3、获取并处理异常

  • Swift 中使用 try-catch 机制获取和处理异常。

    do {try 可抛出异常的方法或函数} catch {// 处理异常情况,默认错误对象 error
    }
  • catch {} 中,不需要显示的指定错误对象,你会默认捕获一个错误对象 error,如果你想替换这个名字,可以使用 cache (let aError) {} 即可。

    do {try 可抛出异常的方法或函数} catch (let aError) {// 处理异常情况,错误对象 aError
    }
  • try-catch 机制简单易懂,很多编程语言也使用类似的机制进行异常处理,但是在 Swift 中有一个比较重要的特性。catchswitch 一样具有模式匹配(Pattern Matching)的能力,所以使用 catch 时可以对异常的解析进行更为高级的处理。

    do {try myMethodRetrunNothing()} catch MyError.notExist {// deal with not exist} catch MyError.outOfRange {// deal with out of range} catch {// deal with other error
    }

4、不处理异常

  • 和可选型类似,编译器强制我们在使用可能抛出错误的方法时使用 try 关键字,既可以使用完整的 try-catch 捕获,也可以使用 try?try!

    • try? 有点类似于可选型中的可选链,如果方法正确,则完全执行,如果抛出错误,则方法提前结束,但不会对抛出的错误进行处理。
    • try! 的用法类似于可选型中的强制解包,同样不会对错误进行处理,但是一旦方法抛出错误,就会造成整个程序的崩溃。
    try? myMethodRetrunNothing()try! myMethodRetrunNothing()

5、总结

  • 使用 Error 的帮助建立你的异常类型。
  • 使用 throws 来声明异常,用 throw 来抛出异常。
  • 使用 try-catch 机制来获取和处理异常。

  • 下面来举例看看如何使用,用使用手机刷朋友圈为例。首先我们需要定义异常枚举,从 Swift 2.0 中开始 Apple 提供了 Error 协议,我们自定义的异常枚举需要遵循

    // 定义异常枚举
    enum WechatError: Error {case noBattery                      // 手机没电case noNetwork                      // 手机没网case noDataStream                   // 手机没有流量
    }
  • 我们定义了导致不能刷微信的错误枚举 WechatError,然后定义一个检查是否可以刷微信的方法 checkIsWechatOk()

    // 定义异常抛出方法
    func checkIsWechatOk(isPhoneHasBattery: Bool,isPhoneHasNetwork: Bool,dataStream: Int) throws {guard isPhoneHasBattery else {throw WechatError.noBattery}guard isPhoneHasNetwork else {throw WechatError.noNetwork}guard dataStream > 50 else {throw WechatError.noDataStream}
    }
  • 在方法名后有 throws 关键字,意思为该方法产生的异常向上层抛出,在方法体内使用 guard 语句对各种状态进行判断,然后使用 throw 关键字抛出对应的异常。然后我们定义刷微信的方法。

    // 定义刷微信的方法
    func playWechat(isPhoneHasBattery: Bool, isPhoneHasNetwork: Bool, dataStream: Int) {do {try checkIsWechatOk(isPhoneHasBattery: isPhoneHasBattery,isPhoneHasNetwork: isPhoneHasNetwork,dataStream: dataStream)print("放心刷,刷到天昏地暗!")} catch WechatError.noBattery {print("手机都没电,刷个鬼啊!")} catch WechatError.noNetwork {print("没有网络哎,洗洗玩单机吧!")} catch WechatError.noDataStream {print("没有流量了,去蹭Wifi吧!")} catch {print("见鬼了!")}
    }playWechat(isPhoneHasBattery: true, isPhoneHasNetwork: true, dataStream: 60)  // 放心刷,刷到天昏地暗!
    playWechat(isPhoneHasBattery: true, isPhoneHasNetwork: false, dataStream: 60) // 没有网络哎,洗洗玩单机吧!
    playWechat(isPhoneHasBattery: false, isPhoneHasNetwork: true, dataStream: 60) // 手机都没电,刷个鬼啊!
    playWechat(isPhoneHasBattery: true, isPhoneHasNetwork: true, dataStream: 30)  // 没有流量了,去蹭Wifi吧!
    • 上述的代码示例中,首先检查是否可以刷微信的方法前使用 try 关键字,表示允许该方法抛出异常,然后使用了 do catch 控制语句捕获抛出的异常,进而做相关的逻辑处理。

转载于:https://www.cnblogs.com/QianChia/p/8670872.html

Swift 异常处理相关推荐

  1. Swift - 异常处理

    Swift - 异常处理 参考文章: (1)Swift - 异常处理 (2)https://www.cnblogs.com/junhuawang/p/6231084.html 备忘一下.

  2. Swift 异常处理

    如何建造异常类型? 在 iOS 开发当中,我们会面对很多异常处理.在 Cocoa Touch 中我们使用 NSError 来进行异常处理.在新的 Swift 2.0 中,我们可以使用新的 ErrorT ...

  3. Swift41/90Days - 面向轨道编程 - Swift 中的异常处理

    问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 验证一下请求是否合法,将请求进行格式转化 ...

  4. swift抛出异常_swift之异常处理

    官网地址:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_La ...

  5. 你需要知道的有关Selenium异常处理的都在这儿

    什么是异常? 顾名思义,作为程序员的一种常用术语,"异常"与任何特定的编程语言无关.它属于程序因为突然中止,而未能交付出预期输出的事件.通常,引发异常出现的潜在因素往往来自如下方面 ...

  6. Swift反射API及其用法

    尽管 Swift 一直在强调强类型.编译时安全和静态调度,但它的标准库仍然提供了反射机制.可能你已经在很多博客文章或者类似Tuples.Midi Packets和Core Data的项目中见过它.也许 ...

  7. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b

    本页包含内容: 委托(Delegation) 错误处理(Error Handling) 键值观察(Key-Value Observing) Target-Action模式(Target-Action) ...

  8. Swift 烧脑体操(五)- Monad

    前言 \\ Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说 ...

  9. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

最新文章

  1. WPF XAML 资源样式模板属性存放位置
  2. Linux 文件系统的目录结构
  3. c# 字符串排序 (面试题)
  4. CodeForces - 1480D2 Painting the Array II(dp)
  5. 蔻驰和mk哪个更大牌_mk和coach哪个好?mk和coach包包是一个档次吗?
  6. Python开课复习10
  7. centos usb转网口_CentOS5.6系统中安装并使用USB无线网卡(配置成功) 转
  8. ES6学习(一)— Babel转码器的使用和配置
  9. Git:如何在本地没有分支时,切换分支
  10. python入门指南by-Python 入门指南
  11. 2015.7.9(1000股涨停,未按分段交易中国重工、中国软件减仓失误!补做大智慧、中色股份追高,而后控制仓位预防高开跳水——重新整理分段交易原则)发现中软吸筹率极高...
  12. 软件基本功:数组赋值,一定要对齐
  13. 训练集,测试集和验证集
  14. VueSSR的一些理解和详细配置
  15. 2021阿里淘系工程师推荐书单
  16. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player
  17. opencv 白平衡之灰度世界算法
  18. 软考高级软件架构师学习笔记二(软件工程)
  19. 提高QPS方法基本思路
  20. 上海亚商投顾:沪指高开低走涨0.45% 大消费王者归来

热门文章

  1. JavaWeb_响应和请求数据包
  2. ReactNative环境配置的坑
  3. bzoj1433: [ZJOI2009]假期的宿舍
  4. Codeforces Round#434 DIV.2
  5. Ubuntu 之 atom 安装以及 常用配置
  6. Dateset学习笔记
  7. leetcode算法题--三数之和
  8. OpenStack Neutron浅析(四)
  9. python3作用域
  10. 花呗分期计算器_花呗分期最多能分多久?