Swift 和 Python 两种语言中带关联信息错误(异常)类型的比较

0. 概览
如果我们分别在平静如水、和谐感人的 Swift 和 Python 社区抛出诸如“Python 是天下最好的语言…” 和 “Swift 是宇宙第一语言…”之类的言论会有怎样的“下场”?
我们并不想对可能发生的“炸裂”景象做出什么预测,也无意比较 Swift 与 Python 的孰强孰弱。我们只是想聊聊 Swift 和 Python 语言中一个非常有趣的话题:看看谁实现带关联信息的错误(异常)类型更优雅?
在本篇博文中,您将了解到如下内容:
- 0. 概览
- 1. “抛出?还是不抛出错误?这是个问题!”
- 2. 带关联信息的错误
- 3. Python 中的实现
- 4. Swift 中实现
- 5. 那么问题来了:谁更优雅呢?
- 总结
还等什么呢?Let’s go!!!😉
1. “抛出?还是不抛出错误?这是个问题!”
在秃头码农们辛勤操劳的每一天都会遇到多如牛毛的代码错误,俗话说得好:“事无常形,人无完人”,没有错误的代码只能是还没有写出来的代码。
所幸的是几乎所有语言均对错误做出了良好和友善的支持,Swift 与 Python 自然也不例外!
在 Swift 中我们把代码能够抛出的某种“不安分”的东东称为错误(Error),而在 Python 中这被称之为异常(Exception)。其实从这种意义上来说它们是同一种东西,所以在本篇博文中统统称之为错误。
当函数或方法出现“不按常理出牌”的结果时,我们就有必要抛出一个错误。比如除以零:
enum AppError: Error {case divisionByZero
}func div(dividend: Int, divisor: Int) throws -> Int {guard divisor != 0 else {throw AppError.divisionByZero}return dividend / divisor
}
上面是 Swift 中对此的一个实现,在 Python 中有类似的表达:
class DivisionByZero(Exception):passdef div(dividend, divisor):if divisor == 0:raise DivisionByZero()return dividend / divisor
2. 带关联信息的错误
在某些情况下,我们希望抛出的错误中携带一些有用的信息,这种错误称之为:带关联信息的错误。
比如当用户输入的文本太短不符合要求时,我们希望进一步了解到用户输入文本的实际长度以及最短需要的长度。
在 Swift 中我们可以通过枚举关联类型来实现带关联信息的错误,类似的在 Python 中我们可以用异常类的附加实例属性来达到这一相同目的。
关于更多 Swift 中枚举使用的奥秘,请小伙伴们移步我的专题视频观看:
- Swift 基本功修炼:深入浅出 Swift 中的枚举类型
如果小伙伴们还想进一步学习 Swift 语言的开发技巧,可以到我的专题专栏中继续研究:
- Swift 语言开发精讲(文章平均质量分 97)
下面我们就来分别看看它们的实现吧!
3. Python 中的实现

在 Python 中可以简单的为自定义异常类增加实例属性变量:
class TextTooShortException(Exception):def __init__(self, actual, min):super().__init__(self)self.actual = actualself.min = minMIN_LEN = 3try:text = "wo"if len(text) < MIN_LEN:raise TextTooShortException(len(text), MIN_LEN)
except TextTooShortException as error:print("错误:文本太短({}),希望不小于 {} 个字符!".format(len(text), MIN_LEN))
如上代码所示,我们创建了一个自定义异常类 TextTooShortException,其中分别用 actual 和 min 实例属性变量来存放输入文本实际和最短所需的长度。
我们看看运行结果:

4. Swift 中实现

在 Swift 中对于错误这种不需要实例化的对象,一般可以用枚举来表示(当然也可以用 struct,这要分情况而定)。
对于带关联信息的错误,我们只需要创建带关联类型的枚举元素即可:
enum MyError: Error {case textTooShort(actual: Int, min: Int)
}let text = "wo"do {if text.count < MIN_LEN {throw MyError.textTooShort(actual: text.count, min: MIN_LEN)}
} catch let my_error as MyError {if case MyError.textTooShort(let actual, let min) = my_error {print("输入文字长度(\(actual))太短了,不能小于(\(min))")} else {print("其它 MyError: \(my_error)")}
} catch {print("Other ERR: \(error)")
}
在上面的代码中,我们创建了一个 MyError 类型的错误,并添加了一个 textTooShort 枚举子项。其中我们为其嵌入了两个 Int 值作为关联类型,分别用来表示 actual 和 min 值。
以下是 Playground 中的运行结果:

5. 那么问题来了:谁更优雅呢?
看过上面两种实现,各位小伙伴们可能都会有自己的考量。
在 Swift 中使用类似于命名元组的枚举关联类型,显得更轻量级。表达 Error 这一概念无需动用 Class 这一重型武器,一个简单的值类型(enum)足以!
在 Python 中的实现也很简单,不过使用类来作为异常的载体显得更加“厚重”,更加中规中矩。
平心而论:Python 在捕获并处理异常时更加简洁,而 Swift 在定义错误时更轻量级,可惜关联类型枚举在错误解析时比较拖垮。
不过,谁说在 Swift 中不能用 Python 的方式自定义错误呢?😉
struct TextTooShortError: Error {var actual: Intvar min: Int
}let text = "wo"do {if text.count < MIN_LEN {throw TextTooShortError(actual: text.count, min: MIN_LEN)}
} catch let tooShortError as TextTooShortError {print("输入文字长度(\(tooShortError.actual))太短了,不能小于(\(tooShortError.min))")
} catch {print("Other ERR: \(error)")
}
总结
在本篇博文中,我们讨论了在 Swift 和 Python 两种语言中对于带关联信息的错误(异常)类型是如何实现的这一话题,并对哪种实现更优雅给出笔者自己的感悟。
感谢观赏,再会!😎
相关文章:
Swift 和 Python 两种语言中带关联信息错误(异常)类型的比较
0. 概览 如果我们分别在平静如水、和谐感人的 Swift 和 Python 社区抛出诸如“Python 是天下最好的语言…” 和 “Swift 是宇宙第一语言…”之类的言论会有怎样的“下场”? 我们并不想对可能发生的“炸裂”景象做出什么预测,也无意比较 Swift 与 Pytho…...
北京联通iptv组播配置
多年前折腾过iptv,近期搬家换了个大电视,打算把iptv配置好了,尽管不怎么看,但聊胜于无。 其实很简单,用到了一些工具,记录如下 1. openwrt配置 因为有软路由,所以就借助openwrt了,一…...
C++ STL 迭代器失效
一、学习资料 STL迭代器的使用 二、vector容器获取值是下标法和at()的区别 vector<int> vA; int array[]{0,1,2,3,4}; vA.assign(array,array5); cout<<vA[6]<<endl; cout<<va.at(6)<<endl;如上述代码,当使用vA[6]的方式出现访问越…...
麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包
原文链接:麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包 hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章02-软件仓库添加新的软件包,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上&…...
专业媒体播放软件Movist Pro中文
Movist Pro是一款专为Mac用户设计的专业媒体播放器。它支持广泛的视频和音频格式,包括MP4、AVI、MKV等,并提供了高级播放控件和定制的视频设置。其直观易用的用户界面,使得播放高清视频更为流畅,且不会卡顿或滞后。同时࿰…...
数据结构-邻接表广度优先搜索(C语言版)
对于一个有向图无向图,我们下面介绍第二种遍历方式。 广度优先搜索,即优先对同一层的顶点进行遍历。 如下图所示: 该例子,我们有六个顶点, 十条边。 对于广度优先搜索,我们先搜索a,再搜索abc…...
Py之auto-gptq:auto-gptq的简介、安装、使用方法之详细攻略
Py之auto-gptq:auto-gptq的简介、安装、使用方法之详细攻略 目录 auto-gptq的简介 1、版本更新历史 2、性能对比 推理速度 困惑度(PPL) 3、支持的模型 3、支持的评估任务 auto-gptq的安装 auto-gptq的使用方法 1、基础用法 (1)、量…...
【Linux】Linux+Nginx部署项目(负载均衡动静分离)
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Nginx负载均衡 1.什么是负载均衡 2.实…...
C++笔记之vector的成员函数swap()和data()
C笔记之vector的成员函数swap()和data() 标准C中的std::vector类确实有swap()和data()这两个成员函数。下面是它们的简要描述: swap(): std::vector的swap()成员函数用于交换两个向量的内容,实现了高效的交换操作,不需要复制向量的元素。这…...
Linux centos环境 安装谷歌浏览器
教程 地址...
go-gin-vue3-elementPlus带参手动上传文件
文章目录 一. 总体代码流程1.1 全局Axios部分样例1.2 上传业务 二. 后端部分三. 测试样例 go的mvc层使用gin框架. 总的来说gin的formFile封装的不如springboot的好.获取值有很多的坑. 当然使用axios的formData也有不少坑.现给出较好的解决办法 以下部分仅贴出关键代码 一. 总…...
艺术的维度:洞察AI诈骗,优雅防范之艺术
当前,AI技术的广泛应用为社会公众提供了个性化智能化的信息服务,也给网络诈骗带来可乘之机,如不法分子通过面部替换语音合成等方式制作虚假图像、音频、视频仿冒他人身份实施诈骗、侵害消费者合法权益。 以下是一些常见的AI诈骗例子…...
JavaScript的作用域和作用域链
作用域 ● 作用域(Scoping):我们程序中变量的组织和访问方式。"变量存在在哪里?“或者"我们可以在哪里访问某个变量,以及在哪里不能访问?” ● 词法作用域(Lexical scopingÿ…...
电脑文件批量重命名攻略:高效操作技巧助您轻松完成任务
在日常使用电脑时,我们经常需要对文件进行重命名。当文件数量众多时,手动重命名既耗时又容易出错。此时,借助一些实用技巧,我们可以轻松地完成电脑文件的批量重命名。本文将提供一份全面的电脑文件批量重命名攻略,帮助…...
四、三种基本程序结构
1、程序结构 (1)在C语言程序中,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构。 顺序结构:按照事务本身特性,必须一个接着一个来完成。选择结构:到某个节点后,会根据一次判断结果来决定之后…...
深入理解元素的高度、行高、行盒和vertical-align
1.块级元素的高度 当没有设置高度时,高度由内容撑开,实际上是由行高撑开,当有多行时,高度为每行的行高高度之和。 行高为什么存在? 因为每行都由一个行盒包裹,行高实际上是行盒的高度。 2.什么是行盒&am…...
什么叫储能能量管理单元EMU?储能能量管理单元EMU功能?储能EMU是什么?储能能量管理系统如何实现一次调频AGC-AVC功能?
一:储能EMU是什么意思?什么叫储能能量管理单元EMU? EMU是能量管理单元的英文缩写 (Energy Management Unit, EMU) EmuPower3300能量管理单元EMU是由广州智昊电气研发配套EsccPower3300储能协调管理器组成对光伏电站的管理,控制,…...
机器学习之决策树
决策树: 是一种有监督学习方法,从一系列有特征和标签的数据中总结出决策规则,并采用树状图的结构来呈现规则,用来解决分类和回归问题。 节点:根节点:没有进边,有出边。包含最初的,针…...
聊聊logback的UNDEFINED_PROPERTY
序 本文主要研究一下logback的UNDEFINED_PROPERTY substVars ch/qos/logback/core/util/OptionHelper.java public static String substVars(String input, PropertyContainer pc0, PropertyContainer pc1) {try {return NodeToStringTransformer.substituteVariable(input,…...
记一次pdjs时安装glob出现,npm ERR! code ETARGET和npm ERR! code ELIFECYCLE
如往常一样,我使用pdjs来编译proto文件,但出现了以下报错: 大致就是pdjs的util在尝试执行npm install glob^7.2.1 escodegen^1.13.0时出错了 尝试手动执行安装,escodegen被正确安装,但glob^7.2.1出错 npm ERR! code E…...
Jetson Orin Nano 升级jetpack5.1.2刷机过程记录
一.刷机起因 orin nano 接了个IMX477的摄像头,用 命令行DISPLAY:0.0 nvgstcapture-1.0 显示的画面有撕裂,让卖家查问题,卖家测试没有撕裂,对比环境,orin nano出厂默认的是jetpack5.1.1,卖家用的jetpack5.1.2版本,为了解决差异,要升级jetpack版本,前后搞了2天半,记录一下. 另外…...
HFSS仿真结果怎么看?以T型波导为例,读懂S参数与电场动态图
HFSS仿真结果深度解析:从S参数到电场动态图的实战指南当你第一次在HFSS中完成T型波导仿真后,面对满屏的曲线和彩色云图,是否感到既兴奋又困惑?那些起伏的S参数曲线究竟告诉你什么信息?电场图中跳跃的颜色又代表怎样的物…...
别再死记硬背SMO公式了!用Python手写一个SVM分类器,带你一步步拆解SMO核心逻辑
用Python手写SVM分类器:代码驱动理解SMO算法核心在机器学习领域,支持向量机(SVM)以其优秀的分类性能和坚实的数学基础著称。然而,许多学习者在理解其核心算法——序列最小优化(SMO)时,往往被复杂的数学推导所困扰。本文将采用一种…...
Python PIL 画矩形框
基础代码 from PIL import Image, ImageDraw# 打开图片 img Image.open(your_image.jpg)# 创建绘图对象 draw ImageDraw.Draw(img)# 矩形坐标 (x1, y1, x2, y2) coords (23, 21, 69, 76)# 画矩形框(红色,线宽2) draw.rectangle(coords, ou…...
什么情况下会核销贷款
贷款核销的核心前提是:贷款被认定为 “损失类” 且经 “穷尽追偿” 仍无法收回,银行按监管与会计规则从账面冲销,但债权不消灭、仍可追偿。一、核心认定条件(满足其一即可)破产 / 注销 / 吊销:借款人和担保…...
总线式智能提示灯系统设计:从恒流驱动到模块化架构
1. 项目概述:从传统到智能的剧场提示灯系统革新在剧场、演播室或者大型活动现场的后台,如果你待过,一定对那套“红灯停,绿灯行”的提示灯系统不陌生。导演或舞台监督通过对讲机喊“Standby”(准备)…...
收藏|2026年大模型算法岗崛起!程序员小白入门高薪赛道全攻略
前些年,算法岗位一直稳居技术圈高薪行列,无数程序员争相入局,也成为计算机专业毕业生求职首选方向。 伴随大模型技术飞速迭代落地,行业就业格局迎来重大变革。如今含金量最高、人才缺口最大、长期发展潜力顶尖的岗位,已…...
DeepSeek-R1代码补全实测报告:37个真实项目、8类编程语言、48小时压测后,我删掉了Copilot
更多请点击: https://intelliparadigm.com 第一章:DeepSeek-R1代码补全实测报告总览 DeepSeek-R1 是深度求索(DeepSeek)推出的开源大语言模型,专为代码理解与生成任务优化。本章聚焦其在主流 IDE 环境中代码补全能力的…...
MNE-Python 第9天学习笔记:源定位基础
一、什么是源定位? 1.1 通俗理解 到目前为止,我们分析的是"头皮上的脑电":头皮电极 → 记录头皮表面的电位↓这就像在地球表面测量地震波我们想知道的是:震源在哪里?多深?源定位 从头皮电位反推…...
关于内卷,几个值得深想的洞察
首先声明:这篇不劝躺平,也不教内卷——只是想说清楚,你到底在一个什么样的游戏里。 你以为内卷是“资源不足”,其实是“分配方式” 很多人对内卷有个本质上的认知错误:以为内卷是因为资源不够,大家为了抢资…...
