Z
ZHANK
编程在线教程Swift 教程错误处理 try/catch
错误与内存

错误处理 try/catch

throw/throws、do-try-catch、try?/try!、defer 清理

错误处理 try/catch

Swift 用 throw 抛出错误,do-try-catch 处理。try?/try! 是简化版本,defer 保证清理。

学完本章你将: 掌握 throw/throws、do-try-catch、try?/try!、defer。


抛出与处理

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

func fetchData(from url: String) throws -> Data {
    guard !url.isEmpty else { throw NetworkError.badURL }
    // ... 网络请求
    return Data()
}

do {
    let data = try fetchData(from: "https://example.com")
    print(data)
} catch NetworkError.badURL {
    print("无效 URL")
} catch NetworkError.serverError(let code) {
    print("服务器错误: \(code)")
} catch {
    print("其他错误: \(error)")
}

try? / try!

swift
// try? —— 错误时返回 nil
let data = try? fetchData(from: "")
// data 是 Data?——出错为 nil

// try! —— 断言不抛错(出错时崩溃)
let data = try! fetchData(from: "valid-url")  // ⚠️ 慎用

defer —— 延迟执行

swift
func processFile() {
    print("打开文件")
    defer { print("关闭文件") }  // 离开作用域时执行——无论是否抛错

    print("处理中...")
    // 即使这里 throw 或 return,defer 也会执行
}
// 打开文件 → 处理中... → 关闭文件