我正在尝试对我正在使用的 API 可能返回的错误以及可能的网络错误进行建模。
我正在努力弄清楚我是否应该使用 Struct/Class
方法,其中每种类型的错误都被建模为 Struct/Class
,或者 Enum
方法。
这里有一些需要考虑的注意事项:
- 根据出现的问题,相同的 API 调用可以使用不同的
media-types
(因此不同的 JSON)返回不同的错误。所以我的错误有不同的属性。我不想将请求响应公开为简单的 JSON 对象/字典。 - 我希望由客户端/服务器问题引起的错误也具有
httpStatusCode
属性(对于与无连接相关的错误,它将为 nil) - 我想要一个错误来指示正确的本地化消息的连接问题。
- 我想对
sync
调用(与throws
一起使用)和async
调用(用作完成 block )
主要是因为第一个要求很难弄清楚如何沿着 Enum
的方式走下去。但也许我遗漏了一些东西,也许 Enum
类型中仍有一些我不知道的功能。
如有任何建议,我们将不胜感激。
最佳答案
通常 enum
是处理 Swift 错误的最佳方法。要提供不同的类型,您可以使用关联值,对于本地化描述,您可以为您的枚举实现 LocalizedError
协议(protocol),例如:
enum NetworkError : Error, LocalizedError {
case noInternet
case httpStatus(Int)
case unknown(Error)
public var errorDescription: String? {
switch self {
case .noInternet:
return "No Internet"
case .httpStatus(let code):
return "HTTP status code: \(code)"
case .unknown(let error):
return "Error: \(error)"
}
}
}
let err1 = NetworkError.noInternet
print(err1.localizedDescription)
let err2 = NetworkError.httpStatus(404)
print(err2.localizedDescription)
let err3 = NetworkError.unknown(error)
print(err3.localizedDescription)
/*
Prints:
No Internet
HTTP status code: 404
Error: error
*/
但是如果您有错误的通用数据,您应该实现 struct
来保存具有错误类型的所需属性:
struct ResponseError: Error {
enum ErrorType {
case badStatusCode
case noJson
case invalidJson(Error)
}
let type: ErrorType
let statusCode: Int
}
let err = ResponseError(type: .badStatusCode, statusCode: 404)
从文档中阅读有关以下内容的更多信息:https://developer.apple.com/documentation/swift/error
关于ios - Swift 错误处理——结构/类与枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336627/