Swift 中的错误处理:try/catch 与进阶技巧

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift中的错误处理:try/catch及更多——高级水平



错误处理是任何严肃的iOS/macOS开发中不可或缺的一部分。Swift提供了一套强大且富有表现力的错误管理系统,其范围远超简单的try/catch。在本文中,我们将探讨高级技术:Error协议的使用、错误枚举、throws和rethrows关键字,以及Result类型和函数式方法。本文面向已熟悉Swift基础的开发者。



1. Error协议与自定义错误类型



Swift中错误处理的基础是Error协议。任何符合该协议的类型都可以作为错误抛出。最常用的方式是使用枚举(enum)。



import Foundation

// 为网络请求定义自定义错误类型enum NetworkError: Error { case invalidURL case noData case decodingFailed(description: String) case serverError(statusCode: Int)}

// 可能抛出错误的函数func fetchUserData(from urlString: String) throws -> Data { guard let url = URL(string: urlString) else { throw NetworkError.invalidURL }

// 模拟网络请求 let success = Bool.random() if !success { throw NetworkError.serverError(statusCode: 500) }

return Data()}


使用枚举可以分组相关错误并传递附加信息(associated values),使代码更具可读性和自文档化。



2. do-catch的高级用法



do-catch块是捕获错误的主要工具。在高级层面,重要的是能够以不同方式处理不同类型的错误。



func processUserData() {    do {        let data = try fetchUserData(from: "https://api.example.com/user")        // 处理数据        print("数据已获取:\\(data.count) 字节")    } catch NetworkError.invalidURL {        print("错误:无效的URL")    } catch NetworkError.serverError(let code) where code >= 500 {        print("服务器错误,代码为\\(code)。请稍后重试。")    } catch let error as NetworkError {        print("网络错误:\\(error)")    } catch {        // 处理所有其他错误        print("未知错误:\\(error.localizedDescription)")    }}


关键点:

  • 带where的模式匹配:允许根据附加条件过滤错误(例如,响应代码范围)。
  • 类型转换(as):如果你预期多种错误类型,可以使用catch let error as MyErrorType。
  • 通用catch:应始终放在最后,因为它会捕获任何未处理的错误。


3. throws、rethrows关键字与错误传播



throws关键字表示函数可能抛出错误。rethrows是一种更精细的机制:它表示函数仅在其某个闭包参数(closure)抛出错误时才会抛出错误。



// 带throws的函数——自身可能抛出错误func loadConfig() throws -> [String: String] {    // ...    throw NetworkError.noData}

// 带rethrows的函数——传递来自闭包的错误func performWithRetry(times: Int, operation: () throws -> Void) rethrows { for _ in 0..<times { try operation() }}

// 使用do { try performWithRetry(times: 3) { try loadConfig() }} catch { print("操作在3次尝试后失败:\\(erro")

博客

书籍推荐