使用 LocalizedError 自定义错误类型
设计丰富的错误枚举,使其遵循 Error 和 LocalizedError。
使用 LocalizedError 自定义错误类型 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
设计良好的错误类型会携带足够的上下文,以便诊断问题并显示便于用户理解的消息。`LocalizedError` 为此提供了所需的接口。
基本错误枚举
```swift
enum AuthError: Error {
case invalidCredentials
case accountLocked(until: Date)
case networkUnavailable
}
```
LocalizedError 协议
```swift
extension AuthError: LocalizedError {
var errorDescription: String? {
switch self {
case .invalidCredentials: return "Username or password is incorrect."
case .accountLocked(let date): return "Account locked until \(date.formatted())."
case .networkUnavailable: return "No internet connection."
}
}
}
print(AuthError.invalidCredentials.localizedDescription)
```
failureReason 与 recoverySuggestion
```swift
extension AuthError: LocalizedError {
var failureReason: String? { "Authentication service rejected the request." }
var recoverySuggestion: String? { "Reset your password or contact support." }
}
```
嵌套错误上下文
```swift
enum APIError: Error {
case server(statusCode: Int, body: String)
case decode(underlying: DecodingError)
case timeout
}
```
请携带底层错误,以便在日志中记录,或在调试构建中显示。
抛出自定义错误
```swift
func login(user: String, pass: String) throws -> Token {
guard !user.isEmpty && !pass.isEmpty else { throw AuthError.invalidCredentials }
// ...
}
```
捕获特定情况
```swift
do {
let token = try login(user: u, pass: p)
} catch AuthError.invalidCredentials {
showAlert("Bad credentials")
} catch AuthError.accountLocked(let date) {
showAlert("Locked until \(date)")
} catch {
showAlert(error.localizedDescription)
}
```
CustomDebugStringConvertible
```swift
extension AuthError: CustomDebugStringConvertible {
var debugDescription: String { "AuthError.\(self)" }
}
```
错误包装模式
```swift
enum AppError: Error {
case auth(AuthError)
case api(APIError)
case unknown(Error)
}
func process() throws {
do { try login() }
catch let e as AuthError { throw AppError.auth(e) }
catch { throw AppError.unknown(error) }
}
```
用于测试的可比较错误
```swift
enum FetchError: Error, Equatable {
case notFound
case serverError(code: Int)
}
XCTAssertEqual(error, FetchError.notFound)
```
快速检查
哪个协议为面向用户的错误消息提供 `errorDescription`?
回顾
要点回顾:
• 让错误遵循 `LocalizedError`,以提供面向用户的消息
• 使用关联值携带上下文(状态码、日期)
• 将较低层的错误包装在特定领域的枚举中
• `Equatable` 错误可以简化单元测试
• `CustomDebugStringConvertible` 有助于调试
下一节:将结果类型桥接到异步/等待。
常见问题解答
「使用 LocalizedError 自定义错误类型」课时是免费的吗?
是的 — 「使用 LocalizedError 自定义错误类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 LocalizedError 自定义错误类型」这节课中我会学到什么?
设计丰富的错误枚举,使其遵循 Error 和 LocalizedError。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 LocalizedError 自定义错误类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Result 基础
- Result 上的 map 与 flatMap
- 使用 LocalizedError 自定义错误类型
- 将 Result 衔接到 async/await