当前位置: 首页 > news >正文

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

在这里插入图片描述

概述

从 Swift 语言诞生那天儿起,它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。

在这里插入图片描述

不过遗憾的是,作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。

在本篇博文中,您将学到如下内容:

  • 概述
  • 1. Swift 6.0 之前的错误机制
  • 2. Swift 6.0 全新的特定错误抛出机制
  • 3. 旧机制的向后兼容性
  • 总结

从 Swift 6.0 开始,苹果为 Swift 添加了全新的错误类型限定机制,我们从此对各种方法究竟抛出何种错误将会始终了然于胸、一目了然。

闲言少叙,让我们马上开始错误抛出大冒险吧!

Let‘s go!!!😉


本博文对应的视频课在此,欢迎小伙伴们恣意观看!

Swift 6.0 如何更优雅的抛出和处理特定类型的错误


1. Swift 6.0 之前的错误机制

众所周知,为任何语言提供错误处理之道都是至关重要的“硬核”操作,Swift 自然也不例外。

在 Swift 6.0 之前,我们可以这样考虑特定方法发生错误时的处理方式:

enum FooError: Error {case tooBigcase tooSmall
}func foo() throws -> Int {let value = Int.random(in: 1...100)guard value < 60 else {throw FooError.tooBig}guard value > 20 else {throw FooError.tooSmall}return value
}

从上面的代码可以看到,我们定义了一个 FooError 错误类型,然后在 foo 方法中根据实际情况抛出其中的错误。

我们可以这样调用 foo 方法:

func boo() {do {let value = try foo()print(value)} catch let error as FooError {switch error {case .tooBig: print("Too big...")case .tooSmall: print("Too small...")}} catch {print("General erro: \(error)")}
}

如您所见:我们使用 do…catch 语法块捕获了 foo 方法调用时可能发生的错误。注意,为了准确我们需要显式“解包”捕获的错误类型。这样会带来几个问题:

  • 如果不看 foo 方法的源代码,无法确切知道它到底会抛出什么样的错误;
  • catch 必须指定具体的错误类型;(当然不指定也可以,但这种情况不在本篇考虑之内)
  • 无法在编译期间发现不适当的错误捕获代码;

为了不让头发已经所剩无几的秃头码农们再揪心于任意方法可能犯下的“弥天大错”,Swift 必须做些什么!

That’s Right!!!

2. Swift 6.0 全新的特定错误抛出机制

好消息来了:从 Swift 6.0 开始我们可以“名正言顺”的让方法抛出指定类型的错误啦!这是通过在方法签名中指明错误类型来实现的:

enum FooError: Error {case tooBigcase tooSmall
}func foo() throws(FooError) -> Int {let value = Int.random(in: 1...100)guard value < 60 else {throw FooError.tooBig}guard value > 20 else {throw FooError.tooSmall}return value
}

在上面的代码中,我们紧接着在 foo 方法定义的 throws 关键字后面添加了可能抛出的错误类型。这样做的好处是:同时让编译器和调用者单凭方法签名就能明了该方法可能抛出的错误了

而且这样一来,由于编译器对可能抛出的错误已然一清二楚,所以我们捕获 foo 方法错误的代码还可以进一步简化:

func boo() {do {let value = try foo()print(value)} catch {switch error {case .tooBig: print("Too big...")case .tooSmall: print("Too small...")}}
}

看到了吗?有了方法抛出错误类型的显式申明之后,我们在 catch 子句中无需再喋喋不休的“解包 Unwrap”实际的错误类型了!是不是很赞呢?

3. 旧机制的向后兼容性

在 Swift 6.0 中,之前的错误抛出和处理机制仍然被延续下来,从而做到连贯而统一。

比如下面的代码:

func foo() throws {}

在 Swift 6.0 中会在“背后”悄悄变为如下形式:

func foo() throws(any Error) {}

这意味着,如果我们在 Swift 6.0 中为不可抛出错误(throws)的方法限定错误类型,Swift 就视其为 any Error。

甚至原本绝不会抛出错误的方法:

func foo() {}

在 Swift 6.0 中也会“偷偷”抛出一个“所谓的” Never 错误类型:

func foo() throws(Never) {}

看到这里,小伙伴们是否对 Swift 6.0 中全新的错误抛出和处理机制一清二楚了呢?棒棒哒!💯


想要系统学习 Swift 的各位小伙伴们,赶快到我的《Swift语言开发精讲》专栏来逛一逛吧:

在这里插入图片描述

  • Swift 语言开发精讲 - 大熊猫侯佩

总结

在本篇博文中,我们讨论了在 Swift 6.0 中如何更加优雅的抛出和处理指定类型的错误,并顺便聊了聊 Swift 6.0 之前的旧机制如何一致的做到向后兼容。

感谢观赏,再会啦!😎

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 每日一问:为什么MySQL索引使用B+树? 第4版 (含时间复杂度对比表格)
  • JVM感知docker容器内存资源限制
  • Blender----利用DEM(tif)生成三维模型
  • 解读红外控制遥控器原理!!!
  • Pytest框架直接右键运行 testcase.py,不执行最外层conftest
  • CACTER直播预告:聚焦EDLP邮件数据防泄露实战重点
  • 基于STM32+手机APP设计的智能停车场系统——程序源码原理图设计原理设计文档演示视频框图等(文末工程资料下载)
  • 数据仓库: 4- 数据质量管理 5- 元数据管理
  • 监控用户登录信息,执行事务码情况
  • websocket的介绍及springBoot集成示例
  • 小区物业维修管理系统/小区居民报修系统
  • html+css+js网页设计 专业:珠宝行业宏观环境分析12个页面
  • AC自动机-2(AhoCorasickDoubleArrayTrie)
  • CMakeLists.txt模板
  • C#:Bitmap类使用方法—第3讲
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【Linux系统编程】快速查找errno错误码信息
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • javascript从右向左截取指定位数字符的3种方法
  • js正则,这点儿就够用了
  • Terraform入门 - 3. 变更基础设施
  • vue-router的history模式发布配置
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 目录与文件属性:编写ls
  • 使用putty远程连接linux
  • 我的zsh配置, 2019最新方案
  • 我看到的前端
  •  一套莫尔斯电报听写、翻译系统
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • zabbix3.2监控linux磁盘IO
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​VRRP 虚拟路由冗余协议(华为)
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)(1.13) SiK无线电高级配置(六)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (二)正点原子I.MX6ULL u-boot移植
  • (回溯) LeetCode 46. 全排列
  • (六)软件测试分工
  • (十六)串口UART
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)js前端开发中设计模式之工厂方法模式
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net mvc 获取url中controller和action
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ C++ ] 继承
  • [100天算法】-二叉树剪枝(day 48)