[Swift 开发] 异常俘获 Do_Try_Catch

2024-05-06 18:48

本文主要是介绍[Swift 开发] 异常俘获 Do_Try_Catch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义抛出Throw类型

表示和抛出错误 在 Swift 中,错误由符合 Error 协议的类型值表示。这个空协议表明一个类型可用于错误处理。

Swift 枚举特别适合对一组相关的错误条件进行建模,关联的值允许传达有关要传达的错误性质的附加信息。

例如,您可以通过以下方式表示在游戏中操作自动售货机的错误条件:

    enum VendingMachineError: Error {case invalidSelectioncase insufficientFunds(coinsNeeded: Int)case outOfStock}

抛出错误让您表明发生了意外情况,正常的执行流程无法继续。使用 throw 语句抛出错误。例如,下面的代码会抛出一个错误,表明自动售货机还需要 5 个额外的硬币:

throw VendingMachineError.insufficientFunds(coinsNeeded: 5)

函数中Throw的运用

要指示函数、方法或初始化程序可以抛出错误,请在函数声明中的参数后面编写 throws 关键字。

标有 throws 的函数称为 throwing 函数。

如果函数指定了返回类型,则在返回箭头 (->) 之前编写 throws 关键字。

    func canThrowErrors() throws -> Stringfunc cannotThrowErrors() -> String

在下面的示例中,VendingMachine 类有一个 vend(itemNamed:) 方法,如果请求的项目不可用、缺货或成本超过当前存入的金额,则该方法会抛出适当的 VendingMachineError

    struct Item {var price: Intvar count: Int}class VendingMachine {var inventory = ["Candy Bar": Item(price: 12, count: 7),"Chips": Item(price: 10, count: 4),"Pretzels": Item(price: 7, count: 11)]var coinsDeposited = 0func vend(itemNamed name: String) throws {guard let item = inventory[name] else {throw VendingMachineError.invalidSelection}guard item.count > 0 else {throw VendingMachineError.outOfStock}guard item.price <= coinsDeposited else {throw VendingMachineError.insufficientFunds(coinsNeeded: item.price - coinsDeposited)}coinsDeposited -= item.pricevar newItem = itemnewItem.count -= 1inventory[name] = newItemprint("Dispensing \(name)")}}

vend(itemNamed:) 方法的实现使用保护语句提前退出该方法并在不满足购买零食的任何要求时抛出适当的错误。因为 throw 语句会立即转移程序控制,所以只有满足所有这些要求才会出售项目。

因为 vend(itemNamed:) 方法会传播它抛出的任何错误,所以任何调用此方法的代码都必须处理这些错误——使用 do-catch 语句、try? 或 try!——或者继续传递它们。

例如,下例中的 buyFavoriteSnack(person:vendingMachine:) 也是一个抛出函数,并且 vend(itemNamed:) 方法抛出的任何错误都会传递到 buyFavoriteSnack(person:vendingMachine:)

    let favoriteSnacks = ["Alice": "Chips","Bob": "Licorice","Eve": "Pretzels",]func buyFavoriteSnack(person: String, vendingMachine: VendingMachine) throws {let snackName = favoriteSnacks[person] ?? "Candy Bar"try vendingMachine.vend(itemNamed: snackName)}

在这个例子中,buyFavoriteSnack(person: vendingMachine:) 函数查找给定人最喜欢的零食,并尝试通过调用 vend(itemNamed:) 方法为他们购买。由于 vend(itemNamed:) 方法可能会抛出错误,因此在调用它时会在其前面加上 try 关键字。 抛出初始化器可以以与抛出函数相同的方式传递错误。

例如,下面清单中的 PurchasedSnack 结构的初始化程序调用一个抛出函数作为初始化过程的一部分,它通过将它们传递给它的调用者来处理它遇到的任何错误。

    struct PurchasedSnack {let name: Stringinit(name: String, vendingMachine: VendingMachine) throws {try vendingMachine.vend(itemNamed: name)self.name = name}}

使用 Do_Try_Catch 处理错误

您可以使用 do-catch 语句通过运行代码块来处理错误。如果 do 子句中的代码抛出错误,则它会与 catch 子句进行匹配,以确定它们中的哪一个可以处理错误。

以下是 do-catch 语句的一般形式:

    do {try expressionstatements} catch pattern 1 {statements} catch pattern 2 where condition {statements} catch pattern 3, pattern 4 where condition {statements} catch {statements}

在 catch 之后编写一个模式来指示该子句可以处理哪些错误。如果 catch 子句没有模式,则该子句匹配任何错误并将错误绑定到名为 error 的本地常量。

例如,以下代码与 VendingMachineError 枚举的所有三种情况相匹配。

    var vendingMachine = VendingMachine()vendingMachine.coinsDeposited = 8do {try buyFavoriteSnack(person: "Alice", vendingMachine: vendingMachine)print("Success! Yum.")} catch VendingMachineError.invalidSelection {print("Invalid Selection.")} catch VendingMachineError.outOfStock {print("Out of Stock.")} catch VendingMachineError.insufficientFunds(let coinsNeeded) {print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")} catch {print("Unexpected error: \(error).")}// Prints "Insufficient funds. Please insert an additional 2 coins."

在上面的示例中,在 try 表达式中调用了 buyFavoriteSnack(person:vendingMachine:) 函数,因为它会抛出错误。如果抛出错误,则执行立即转移到 catch 子句,它决定是否允许继续传递。如果没有匹配的模式,错误会被最后的 catch 子句捕获并绑定到一个局部错误常量。如果没有抛出错误,则执行 do 语句中的其余语句。

捕获几个相关错误的另一种方法是在 catch 之后列出它们,用逗号分隔。例如

    func eat(item: String) throws {do {try vendingMachine.vend(itemNamed: item)} catch VendingMachineError.invalidSelection, VendingMachineError.insufficientFunds, VendingMachineError.outOfStock {print("Invalid selection, out of stock, or not enough money.")}}

eat(item:) 函数列出要捕获的自动售货机错误,其错误文本对应于该列表中的项目。如果抛出列出的三个错误中的任何一个,这个 catch 子句通过打印一条消息来处理它们。 其它的异常会继续上传递Throw

将Throw转换为Optional类型

你用try?通过将错误转换为可选值来处理错误。如果在评估 try 时抛出错误?表达式,表达式的值为 nil。例如,在以下代码中,x 和 y 具有相同的值和行为:

    func someThrowingFunction() throws -> Int {// ...}let x = try? someThrowingFunction()let y: Int?do {y = try someThrowingFunction()} catch {y = nil}

如果 someThrowingFunction() 抛出错误,则 x 和 y 的值为零。否则,x 和 y 的值就是函数返回的值。请注意, x 和 y 是 someThrowingFunction() 返回的任何类型的可选项。这里函数返回一个整数,所以 x 和 y 是可选的整数。

使用try?当您想以相同的方式处理所有错误时,让您可以编写简洁的错误处理代码。例如,以下代码使用多种方法来获取数据,如果所有方法都失败,则返回 nil。

    func fetchData() -> Data? {if let data = try? fetchDataFromDisk() { return data }if let data = try? fetchDataFromServer() { return data }return nil}

这篇关于[Swift 开发] 异常俘获 Do_Try_Catch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965078

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock