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

news2024/9/29 9:38:35

在这里插入图片描述

概述

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

在这里插入图片描述

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

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

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

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

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

Let‘s go!!!😉


1. Swift 6.0 之前的错误机制

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

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

enum FooError: Error {
    case tooBig
    case 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 tooBig
    case 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.coloradmin.cn/o/2066630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业数字化转型会面临哪些挑战,如何解决?

当前&#xff0c;数字技术发展迅速&#xff0c;已迈入 AI 人工智能时代。企业若不进行数字化转型&#xff0c;可能会被用户抛弃、被竞争对手超越。那么&#xff0c;传统企业在转型过程中会遇到哪些挑战呢&#xff1f; 一、企业数字化转型面临的挑战 1、缺乏明确的战略规划和转…

宠物空气净化器除臭吗?性价比高的宠物空气净化器十大排名分享

来来来&#xff0c;先带大家一睹我店里的小可爱们 是不是超级可爱呀~&#xff1f;这样的大卡车猫猫&#xff0c;在我这猫咖里可是还有好几十只&#xff01;作为一位坐拥几十只猫咪的“猫咖掌门”&#xff0c;朋友们总是投来羡慕的目光。但这份光鲜背后&#xff0c;可是有我无数…

轻松制作 GIF 动图,你也可以!

你是否曾为找不到合适的动图而烦恼&#xff1f; 是否羡慕别人能制作出精彩的 GIF 动图&#xff1f; 现在&#xff0c;无需再羡慕&#xff01;因为我们用以下图片中的方法&#xff0c;你自己也能轻松制作 GIF 动图。 这款工具&#xff0c;操作简单易懂&#xff0c; 即使你没有…

舞动奇迹,亨廷顿舞蹈症患者专属健身秘籍!

&#x1f308; 在小红书的温馨角落里&#xff0c;让我们一起探索一个特别的世界——为亨廷顿舞蹈症&#xff08;HD&#xff09;患者量身定制的健身之旅。HD&#xff0c;这个名字或许带着一丝沉重&#xff0c;但它绝不能定义我们生活的全部色彩。通过科学的锻炼方式&#xff0c;…

APP逆向百例五-Flutter逆向案例----某次元(AES+RSA)

现在售价依旧是99&#xffe5;,计划更新100案例&#xff0c;平均一个案例1块钱&#xff0c;要什么自行车&#xff01; 还原一下我逆向此app的方法 1.抓包分析&#xff1a; 我这边用socksDroid抓不到数据包,但是小黄鸟可以&#xff0c;那就用Reqable结合电脑端进行抓包,不纠结…

Leetcode 347. 前 K 个高频元素

解法&#xff1a; 字典统计排序 class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:cont {}for eve in nums:if eve not in cont: cont[eve] 1else: cont[eve] 1contlist sorted(cont.items(), keylambda x: x[1])res [eve[0] for eve i…

从安装Docker到打包迁移MySQL的完整指南

从安装Docker到打包迁移MySQL的完整指南 每一天过得充实&#xff0c;眼中无迷茫&#xff0c;心中无烦恼。日子就会充满希望&#xff0c;岁月就会洒满清欢。 这篇文章将带你从零开始&#xff0c;在CentOS服务器上安装Docker、使用Docker部署MySQL数据库&#xff0c;并打包和迁移…

凯迪仕智能锁携手唐百电器达成战略合作,市场布局和拓展再加速

近日&#xff0c;凯迪仕智能锁中国区总裁陈露拜访唐山百货大楼集团&#xff08;唐百电器&#xff09;&#xff0c;双方深入交流资源优势&#xff0c;结合唐山市场实际情况达成2024年-2025年度深度战略合作&#xff0c;并完成首次签约千余套凯迪仕智能锁战略目标&#xff0c;接下…

【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离 2项目介绍 系统功能&#xff1a; 中小型人力资源管理系统包括管理员、人事管理员、普通人员三种角色。 管理员…

【JS】不使用BigInt实现大整数相加

前言 JS中整数有存储范围&#xff0c;一旦超出这个范围则会丢失精度&#xff0c;通过MAX_SAFE_INTEGER可以看到JS中支持的最大的、安全的正整数为9007199254740991。 JS新类型BigInt可以处理大整数运算&#xff0c;但这次不逃课&#xff0c;本文将尝试自行处理大整数相加&…

python安装包,2024最新Python下载环境配置教程!

一、Python安装包下载 1.进入Python官网下载&#xff08;如果不想去官网下载可以点击领取安装包&#xff09; Python官网主要有python的About (简介)、Downloads (下载)、Documentation(文档)、Community (团体)、Success Stories (成功案例)、News (新闻)、Events (事件动态…

Windows微调Qwen2-7B-Instruct-甄嬛

一、下载Anaconda 在下载Anaconda之前建议先将电脑原有的python卸载&#xff0c;避免造成冲突。 之后一直Next即可&#xff0c;不过要记得在环境变量中添加Anaconda&#xff08;在安装完成之前会有一个Add PATH选项&#xff0c;可以选上&#xff09; 安装完成之后打开CMD&…

3.2.5 宙之CPU的时分复用

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.2.5.1 __primary_switched开始构建0号进程 宙者&#xff0c;古往今来&#xff0c;时间为宙。盘古为了开天辟地&#xff0c;必须分开空间和时间。在时间维度&#xff0c;要对CPU的运行时间进行切分&#xff0c;…

netty编程之自定义编解码器

写在前面 源码 。 本文看下netty如何自定义编解码器。为此netty专门定义抽象类io.netty.handler.codec.MessageToByteEncoder和io.netty.handler.codec.ByteToMessageDecoder,后续我们实现自定义的编解码器就继承这两个类来做。 1&#xff1a;正戏 server 启动类&#xff1a…

卖一辆亏6万搞倾销,极越汽车高管掀了小米汽车遮羞布?

"炮轰解决不了极越销量问题" 作者 | 魏 强 编辑 | 卢旭成 8月22日早9点40分&#xff0c;极越汽车公关负责人徐继业发朋友圈炮轰小米汽车创始人雷军&#xff1a;“雷军这样的企业家&#xff0c;有点公德心和羞耻心好不好&#xff1f;每台车亏6万&#xff0c;亏那么…

Springboot中的mapper与entity难以觉察的匹配问题,困扰我几天时间,形成很大的压力!

最近&#xff0c;应好友邀请&#xff0c;替她做了一个心理疗愈项目的小系统&#xff0c;在编制后台API代码时&#xff0c;遇到了一个不易觉察的问题&#xff0c;终于查找出来&#xff0c;并且解决了&#xff0c;现奉献出来&#xff0c;供大家碰到类似问题&#xff0c;进行参考。…

面试题详解

前言&#xff1a;这一期我们专门来巩固所学知识&#xff0c;同时见识一些面试题。对知识做出一个总结。 1 不创建临时变量交换两个整数 . 第一种方法 #include<stdio.h> int main() {int a 0;int b 0;scanf("%d %d", &a, &b);printf("交换前…

中央空调安装8个标准流程指南

1、内机安装施工队进场第一步就是吊装内机&#xff0c;这里只要注意2个点就可以避免后续问题。 ① 内机离房顶距离不得小于1公分&#xff0c;避免机器运行时与墙顶产生共振。② 内机吊装需考虑百分之一的坡度&#xff0c;接冷凝水的一侧要稍微低一些&#xff0c;避免冷凝水排不…

单个像素的威胁:微小的变化如何欺骗深度学习系统

深度学习&#xff08;DL&#xff09;是人工智能&#xff08;AI&#xff09;的基本组成部分。它的目标是使机器能够执行需要决策机制的任务&#xff0c;这些决策机制往往近似于人类推理。深度学习模型是许多先进应用的核心&#xff0c;例如医疗诊断和自动驾驶汽车。不幸的是&…

饿了么后端登录模块

一、回顾 高并发集群 饿了么后端的登录模块 1、数据库 1. 主从复制(高可用) 2. 传统的主从复制 3. gtids事务型的主从复制 4. 注意 1. server_id唯一 2. 8.x版本需要get_ssl_pub_key 3. 5.x不需要 4. change master to 5. stop | start slave 5. 非交互 import pymy…