错误处理 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 也会执行
}
// 打开文件 → 处理中... → 关闭文件