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

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

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

开始课程

Swift 中的错误处理:try/catch 及更多



在当代 iOS 和 macOS 开发中,应用可靠性是关键的品质指标之一。Swift 中恰当的错误处理不仅能让你避免意外崩溃,还能让代码更易读、更可预测。在本文中,我们将涵盖经典的 try/catch 机制,以及包括 Result 类型、defer 语句和进阶模式在内的替代方案。



基础:Error 协议与 throws 关键字



在 Swift 中,错误由遵循 Error 协议的类型表示。通常使用枚举来实现这一目的。为了让函数能够抛出错误,需要在函数声明中使用 throws 关键字。



enum NetworkError: Error {    case noInternet    case serverError(code: Int)    case timeout}

func fetchData(from url: String) throws -> Data { guard url.hasPrefix("https") else { throw NetworkError.serverError(code: 400) } // ... 模拟加载 return Data()}


注意:如果函数标记了 throws,调用代码必须使用 try、try? 或 try! 来处理可能的错误。



do-catch 结构:经典方式



处理错误最常见的方式是使用 do-catch 代码块。将含有潜在风险的代码放在 do 中,在 catch 中描述针对每个具体错误的处理方式。



do {    let data = try fetchData(from: "http://example.com")    print("Data received: \\(data)")} catch NetworkError.noInternet {    print("No internet connection")} catch NetworkError.serverError(let code) {    print("Server error with code: \\(code)")} catch {    print("Unknown error: \\(error.localizedDescription)")}


重要:最后一个不带模式的 catch 代码块会捕获所有其余错误。这是避免遗漏意外异常的好做法。



try? 和 try!:快速替代方案



如果你不关心错误类型,只想知道函数是否执行成功,可以使用 try?。如果发生错误,结果会是 nil。



if let data = try? fetchData(from: "https://valid.com") {    print("Success: \\(data)")} else {    print("Error during loading")}


try! 操作符是一颗"定时炸弹"。它会抑制错误处理,并且如果错误确实发生,会导致应用崩溃。仅在你 100% 确定不会出错的情况下使用它(例如加载打包的资源时)。



let data = try! fetchData(from: "https://trusted-source.com")// 如果有错误——应用会崩溃


Result 类型:函数式方法



从 Swift 5 开始,标准库中添加了 Result<Success, Failure> 类型。它是一个枚举,可以包含成功值或错误。这种方法在异步代码和完成处理器中尤其方便。



func fetchDataResult(from url: String) -> Result<Data, NetworkError> {    guard url.hasPrefix("https") else {        return .failure(.serverError(code: 400))    }    return .success(Data())}

// 使用let result = fetchDataResult(from: "http://bad.com")switch result {case .success(let data): print("Data: \\(data)")case .failure(let error): print("Error: \\(error)")}


Result 的优势在于你不会忘记处理错误,因为编译器会强制你这样做。

博客

书籍推荐