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

在这里插入图片描述

概述

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

在这里插入图片描述

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

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

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 之前的旧机制如何一致的做到向后兼容。

感谢观赏,再会啦!😎


http://www.ppmy.cn/embedded/99827.html

相关文章

LyP-1;肿瘤淋巴管归巢肽;CGNKRTRGC;CAS号:454487-07-1

【LyP-1肿瘤淋巴管归巢肽 简介】 肿瘤淋巴管归巢肽是一类能够特异性靶向肿瘤淋巴管的多肽&#xff0c;它们通过识别肿瘤细胞表面的特定分子来实现靶向功能。这些肽在肿瘤的诊断和治疗中具有重要的应用潜力&#xff0c;尤其是在药物递送系统中&#xff0c;可以提高药物的靶向性…

Python编程:从入门到实践书籍介绍

对于Python入门的书籍推荐&#xff0c;以下是五本详细讲解的书籍&#xff0c;它们各自具有不同的特点和适用对象&#xff1a; 1. 《Python编程:从入门到实践》 作者&#xff1a;埃里克马瑟斯&#xff08;Eric Matthes&#xff09;《Python编程:从入门到实践》是一本经典的Pyth…

P2P 文件共享:现代网络中的高效文件传输

在互联网的世界中&#xff0c;不同应用程序的数据传输方法各异。P2P文件共享&#xff08;Peer-to-Peer File Sharing&#xff09; 作为一种高效的文件传输方式&#xff0c;使得用户可以在没有中央服务器的情况下直接进行文件交换。本文将详细介绍P2P文件共享的基本原理、优势及…

快9月了才开始强化,刷张宇1000还是李林880?

如果你现在才开始强化&#xff0c;并且在张宇1000和李林880中间纠结&#xff0c;可以花5分钟看看这篇文章&#xff01; 张宇1000题&#xff0c;今年进行了改版&#xff0c;去掉了一些「偏难怪」的题目&#xff0c;这类题目&#xff0c;对于大家的友好度明显上升。但是难度和综合…

Spring Boot工具类一览

今天给大家说说Spring Boot的自带工具类。 Spring Boot作为一个快速开发框架&#xff0c;其自带的工具类是开发过程中不可或缺的一部分。这些工具类的高效和实用性&#xff0c;能够大大提高开发人员的工作效率。在本文中&#xff0c;我们将重点介绍Spring Boot自带的工具类&…

keepalived与lvs

1 lvs Linux服务器集群系统(一) -- LVS项目介绍 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器,是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。章文嵩&#xff0c;是中国国内最早出现的自由软件项目之一。 2 lvs发展…

【25届秋招】饿了么0817算法岗笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/17 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;100min 本试卷还有单选和多选部分&#xff0c;但这部分比较简单就不再展示。 最近终于有时间继续整理之前的笔试题了&#xff0c;因为时间仓促…

如何让python爬虫的数据可视化?

Python 爬虫数据可视化是一个涉及多个步骤的过程&#xff0c;主要包括数据抓取、数据处理、以及使用可视化库进行数据展示。以下是一个基本的流程介绍和示例&#xff0c;帮助你理解如何使用 Python 实现这一过程。 第一步&#xff1a;数据抓取 首先&#xff0c;你需要使用 Pyt…

[mongodb][查询]MongoDb 模糊查询

模糊查询 {name:/HLCSOU17649/i}时间查询 {date:{"$gte":ISODate("2019-11-27T00:00:00Z"),"$lte":ISODate("2019-11-28T00:00:00Z")}}组合查询 {date{"$gte":ISODate("2019-11-27T00:00:00Z"),"$lte":…

Deepin【2】:Deepin系统盘扩容

Deepin【2】&#xff1a;Deepin系统盘扩容 1、进入live系统1.1、live系统入步骤 2、连接网络3、新增系统仓库4、安装gparted应用5、使用gparted进行扩容操作5.1、观察当前分区5.2、压缩data分区5.3、Rootb分区合并空闲空间5.4、Rootb分区压缩空间5.5、Roota合并空闲空间5.6、核…

KCP源码解析系列(五)拥塞控制

流量控制和拥塞控制的区别 如果你约了你的朋友见面聊一件事&#xff0c;有两种沟通方式&#xff1a; 第一种是一次只说一句话&#xff0c;然后等待你的朋友回应“收到”&#xff0c;确认他在听之后&#xff0c;再说下一句话&#xff0c;如此反复&#xff0c;直到事情说完。第…

【GH】【EXCEL】P3: Set Conditional Formatting To Excel Data By Gh

文章目录 conditional formattingdata sourceConditional ScaleConditional Scale Conditional PercentConditional Top Percent Conditional AverageConditional Average Multiple ConditionsConditional BarConditional Bar Conditional UniqueConditional Unique Conditiona…

WPF 中,ControlTemplate 和 DataTemplate 是两种不同类型的模板和区别

1. 用途与定义 ControlTemplate&#xff1a;用于定义控件的外观和视觉行为。每个WPF控件都有一个ControlTemplate&#xff0c;它定义了控件的视觉树结构&#xff0c;包括控件的布局、子元素、样式以及触发器等。通过自定义ControlTemplate&#xff0c;可以彻底改变控件的外观和…

【k8s】master节点重新安装docker-ce

突发发现k8s的master机器的docker service没了 不知道啥时候被我删除了?root@k8s-master-pfsrv:/home/zhangbin/perfwork# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? root@k8s-master-pfsrv:/home/zhan…

mysql8通过data文件恢复数据

背景 云服务器中毒&#xff0c;导致mysql停止。只有data文件 备份mysql数据库文件 1、执行打包命令把data文件下载至本地。 zip -r dest.zip /opt/data/mysql 2、在本地虚拟机搭建相同版本的mysql数据库。 下载python脚本转换.ibd文件为sql文件 1、python转换地址https://…

ECharts tooltip默认html样式,保留样式只对数值格式化

之前遇到过需要对数据进行百分比展示&#xff0c;echarts提供的默认样式还是挺好的所以想保留样式&#xff0c;但是设置了formatter默认样式就没了&#xff0c;所以写了formatter的html字符串模拟还原了一下默认样式&#xff0c;在此记录和分享。 适用场景&#xff1a;对数据进…

QT网络编程: 实现UDP通讯设置

目录 一.widget.ui界面设计 二.创建UDP通信 1.pro文件添加network模块。 2.添加对应头文件 3.定义槽函数&#xff0c;即与 UI 中的按钮点击事件相关联的函数 4.定义类的私有成员 5.关闭按钮 6.信息处理 7.绑定端口 8.发送信息 9.效果图 三.代码演示 1.widget.h 2.…

哈希表 1.两数之和

用hashmap来解&#xff0c;先判断是否为空。对数组每一个进行遍历&#xff0c;用 target - nums[i]&#xff0c;得temp&#xff0c;只需循环判断一个数&#xff0c;从0开始&#xff0c;但此时并不急着将数放入map&#xff0c;可能会存在不用相加就得到target的情况。所有判断完…

AtCoder ABC360E Random Swaps of Balls

此为本人补题时的思路整理&#xff0c;实在是好复杂&#xff08;本人蒟蒻&#xff09; 原题链接 dp设计 p i , j p_{i,j} pi,j​ 表示 i i i 步之后黑球在位置 j j j 的概率。 d p i dp_i dpi​ 表示做了 i i i 次交换之后黑球在第一个的概率&#xff08;对 998244353 99…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景&#xff1a; 我的情况是这样&#xff0c;域名解析是华为云的&#xff0c;然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是90天)&#xff0c;申请步骤如下 主要步骤说明 申请免费SSL证书根据申请时说…