Swift 开发教程系列 - 第9章:错误处理

在 Swift 中,错误处理是一种用于应对可能出错的情况的机制。Swift 提供了多种错误处理方式,以确保应用程序在遇到错误时不会崩溃。本章将介绍如何定义和抛出错误、处理错误、使用 do-catch 语句、try?、try! 以及自定义错误类型。

9.1 定义和抛出错误

在 Swift 中,错误必须遵循 Error 协议。你可以使用枚举来定义不同类型的错误,以便清晰地管理错误情况。

示例代码
enum FileError: Error {case fileNotFoundcase unreadablecase permissionDenied
}func readFile(at path: String) throws -> String {// 模拟一个错误throw FileError.fileNotFound
}

在上例中,FileError 枚举遵循了 Error 协议,定义了三个错误类型。readFile 函数声明了 throws,表示它可能会抛出错误。

9.2 使用 do-catch 捕获错误

使用 do-catch 语句可以捕获和处理抛出的错误。每个 catch 子句可以匹配一个特定的错误类型。

示例代码


do {let content = try readFile(at: "/path/to/file")print(content)
} catch FileError.fileNotFound {print("Error: The file was not found.")
} catch FileError.unreadable {print("Error: The file is unreadable.")
} catch {print("Error: An unknown error occurred.")
}

在上例中,try 用于调用可能抛出错误的函数。若发生错误,程序会进入相应的 catch 块进行处理。

9.3 使用 try? 和 try!

Swift 提供了 try? 和 try! 两种方式来处理错误情况。
• try?:将错误转化为 nil,如果没有错误则返回结果。
• try!:强制执行操作,如果出现错误程序会崩溃。

示例代码
let content = try? readFile(at: "/path/to/file")
print(content ?? "No content")  // 如果出现错误,content 为 nillet forcedContent = try! readFile(at: "/path/to/file")  // 若发生错误会导致程序崩溃

在上例中,try? 在错误时返回 nil,而 try! 强制执行,适用于确信不会发生错误的场景。

9.4 自定义错误处理

有时,需要提供错误信息来帮助调试或为用户提供详细的错误提示。可以在错误枚举中使用关联值(associated values)来传递额外信息。

示例代码
enum NetworkError: Error {case badURLcase requestFailed(error: String)case unknown
}func fetchData(from urlString: String) throws {guard urlString != "" else {throw NetworkError.badURL}// 模拟请求失败throw NetworkError.requestFailed(error: "Timeout")
}do {try fetchData(from: "")
} catch NetworkError.badURL {print("Error: Invalid URL.")
} catch NetworkError.requestFailed(let error) {print("Request failed with error: \(error)")
} catch {print("Unknown error occurred.")
}

在上例中,NetworkError.requestFailed 带有一个关联值 error,用于传递失败原因。

9.5 使用 defer 清理资源

defer 语句用于定义代码块,这些代码块会在当前作用域退出前执行,无论是否发生错误。这在进行资源管理(如关闭文件或释放内存)时非常有用。

示例代码
func processFile() throws {print("Opening file...")defer {print("Closing file...")}// 模拟一个错误throw FileError.unreadable
}do {try processFile()
} catch {print("Error processing file.")
}// 输出:
// "Opening file..."
// "Closing file..."
// "Error processing file."

在上例中,defer 确保无论函数是否抛出错误,都能正确关闭文件。

9.6 错误处理的应用场景

• 网络请求:在进行网络请求时,有可能出现请求失败、数据解析失败等错误。

• 文件操作:文件操作时,可能会遇到权限问题、文件不存在或读取失败等错误。

• 数据转换:例如,将字符串转换为数字时,可能出现无效转换错误。

错误处理使代码更加健壮,有助于应对异常情况。使用 do-catch、try?、try! 和 defer 等方式,可以灵活地处理不同场景下的错误。

通过本章学习,你掌握了 Swift 中的错误处理机制,能够在代码中捕获并处理可能的异常情况。错误处理是构建稳定应用程序的关键,确保你的代码在遇到问题时不会崩溃。下一章将带你了解 Swift 中的泛型,为你的代码提供更高的复用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466466.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新型智慧城市顶层设计方案(118页word)

文档介绍: 新型智慧城市顶层设计方案是一种全局性、前瞻性的规划,旨在通过整合城市各类资源,运用新一代信息技术,推动城市治理、民生服务、产业发展等领域的全面升级,以实现城市的可持续发展和居民生活质量的提升。该…

nginx-proxy-manager实现反向代理+自动化证书(实战)

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 cnginx-proxy-manager实现反向代理自动化证书 nginx-proxy-manager是什么搭建nginx-proxy-manage…

定时器入门:Air780E定时器基础与进阶

今天我们学习的是Air780E定时器基础与进阶,让大家更深入的了解定时器。 一、定时器(timer)的概述 在Air780E模组搭载的LuatOS系统中,定时器(timer)是一项基础且关键的服务。它允许开发者在特定的时间点或周期性地执行代码段&…

C语言复习第7章 自定义类型(结构体+位段+枚举+联合体)

目录 一、结构体1.1 内置类型和自定义类型1.2 结构体的概念1.3 结构体基本的声明1.4 区分两种创建结构体变量的方式1.5 结构体变量的定义和初始化1.6 区分一下typdef和变量列表1.7 匿名结构体类型1.8 访问结构体成员1.9 修改字符数组成员变量的时候 要用strcpy1.10 结构体的传参…

Twitter(X)2024最新注册教程

Twitter 现名为X,因为图标是一只小鸟的形象,大家也叫它小蓝鸟(埃隆马斯克于 2023 年对该平台进行了品牌重塑),目前仍然是全球最受欢迎的社交媒体和微博平台之一,全球活跃用户量大概在4.5亿。尤其是欧美国家…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

[mysql]DDL,DML综合案例,

综合案例 题目如下 目录 综合案例 ​编辑 ​编辑 # 1、创#1建数据库test01_library # 2、创建表 books,表结构如下: # 3、向books表中插入记录库存 # 4、将小说类型(novel)的书的价格都增加5。 # 5、将名称为EmmaT的书的价格改为40,并将…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比,本题所有房屋围成了一圈,那么第一间房子和最后一间房子不能同时打劫,那么就可以分为两种情况:1.选第一间房打劫;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

秃姐学AI系列之:GRU——门控循环单元 | LSTM——长短期记忆网络

RNN存在的问题 因为RNN模型的BPTT反向传导的链式求导,导致需要反复乘以一个也就是说会出现指数级别的问题: 梯度爆炸:如果的话,那么连乘的结果可能会快速增长,导致梯度爆炸梯度消失:如果的话,…

OpenHarmony 入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染:执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新:即父组件中状态变量更新…

机器学习与数据挖掘_使用梯度下降法训练线性回归模型

目录 实验内容 实验步骤 1. 导入必要的库 2. 加载数据并绘制散点图 3. 设置模型的超参数 4. 实现梯度下降算法 5. 打印训练后的参数和损失值 6. 绘制损失函数随迭代次数的变化图 7. 绘制线性回归拟合曲线 8. 基于训练好的模型进行新样本预测 实验代码 实验结果 实验…

机器学习与AI|如何利用数据科学优化库存周转率?

对于所有零售商来说,良好的库存管理都是非常重要的。众所周知,商品如果不放在货架上就无法出售,而如果库存过多则意味着严重的财务负担。 但是做好库存管理绝非易事,它依赖于对未来需求的准确预测和确保始终有合适库存的敏捷供应链…

Proteus中数码管动态扫描显示不全(已解决)

文章目录 前言解决方法后记 前言 我是直接把以前写的 51 数码管程序复制过来的,当时看的郭天祥的视频,先送段选,消隐后送位选,最后来个 1ms 的延时。 代码在 Proteus 中数码管静态是可以的,动态显示出了问题——显示…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK:确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven:下载并安装Maven构建工具,这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器:这里推荐使用Inte…

基于ViT的无监督工业异常检测模型汇总

基于ViT的无监督工业异常检测模型汇总 论文1:RealNet: A Feature Selection Network with Realistic Synthetic Anomaly for Anomaly Detection(2024)1.1 主要思想1.2 系统框架 论文2:Inpainting Transformer for Anomaly Detecti…

数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;用C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

Python | Leetcode Python题解之第542题01矩阵

题目: 题解: class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组,所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…

ENSP作业——园区网

题目 根据上图,可得需求为: 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥,设置SW2为VLAN 20/30的主根桥,且两台交换机互为主备。 3.可以使用super vlan。 4.上层通过静态路由协议完成数据通信过程。 5.AR1作为企…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下,方便跟进: https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

让Apache正确处理不同编码的文件避免中文乱码

安装了apache2.4.39以后&#xff0c;默认编码是UTF-8&#xff0c;不管你文件是什么编码&#xff0c;统统按这个来解析&#xff0c;因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…