[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

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自