在 Swift 中,错误处理通过 Error 协议实现,允许开发者定义、抛出和捕获自定义错误类型。localizedDescription 是 NSError 的属性,用于获取错误的本地化描述。以下是详细说明及示例:
1. Error 协议#
- 核心作用:任何遵循
Error协议的类型(如enum、struct)均可表示错误。 - 典型用法:使用枚举定义一组错误类型。
enum NetworkError: Error { case invalidURL case requestFailed(statusCode: Int) case decodingFailed }
2. 抛出与捕获错误#
- 抛出错误:使用
throw关键字。func fetchData() throws { guard let url = URL(string: "https://example.com") else { throw NetworkError.invalidURL } // ... } - 捕获错误:使用
do-try-catch结构。do { try fetchData() } catch NetworkError.invalidURL { print("URL 无效") } catch let NetworkError.requestFailed(code) { print("请求失败,状态码:\(code)") } catch { print("其他错误:\(error)") }
3. localizedDescription 属性#
- 来源:属于
NSError类型,但 Swift 的Error可桥接到NSError。 - 作用:提供错误的本地化描述,便于展示给用户。
- 默认行为:若未自定义,返回错误类型的名称(如
"invalidURL")。do { try fetchData() } catch { let nsError = error as NSError print("错误描述:\(nsError.localizedDescription)") // 输出示例:The operation couldn’t be completed. (NetworkError error 0.) }
4. 自定义错误描述#
方式一:实现 LocalizedError 协议#
关键属性:
errorDescription: 错误的主要描述。failureReason: 错误的详细原因。recoverySuggestion: 恢复建议。
enum NetworkError: Error, LocalizedError { case invalidURL case requestFailed(statusCode: Int) var errorDescription: String? { switch self { case .invalidURL: return "URL 格式无效" case .requestFailed(let code): return "请求失败 (状态码:\(code))" } } var failureReason: String? { switch self { case .invalidURL: return "请检查 URL 是否包含非法字符" case .requestFailed: return "服务器返回了错误状态码" } } }
方式二:实现 CustomNSError 协议#
- 自定义
NSError的 domain、code 和 userInfo:extension NetworkError: CustomNSError { static var errorDomain: String { "com.example.NetworkError" } var errorCode: Int { switch self { case .invalidURL: return 1001 case .requestFailed: return 1002 } } var errorUserInfo: [String: Any] { [NSLocalizedDescriptionKey: errorDescription ?? "未知错误"] } }
5. 获取本地化信息#
do {
try fetchData()
} catch {
let nsError = error as NSError
print("描述:\(nsError.localizedDescription)")
print("原因:\(nsError.localizedFailureReason ?? "")")
print("建议:\(nsError.localizedRecoverySuggestion ?? "")")
}6. 其他相关协议#
RecoverableError: 定义可恢复错误(如提供恢复选项)。CustomDebugStringConvertible: 自定义调试时的错误描述(通过debugDescription)。
总结#
Error协议:定义错误类型的基础。localizedDescription:通过桥接NSError获取用户友好的错误描述。- 自定义描述:优先实现
LocalizedError或CustomNSError协议。 - 最佳实践:使用枚举组织错误,结合协议提供清晰的错误信息。