清晰错误
清晰错误的目标是防止您向用户展示如下字符串
操作无法完成。(第三方模块。(0xx10d6b4a44 的未知上下文)。SomeError 错误 0。)
该字符串是 Swift Error
的默认 localizedDescription
。使用 LegibleError 取代它,您将得到类似以下的字符串
操作无法完成。(第三方模块.SomeError.networkFailure(http: 503))
Error.legibleLocalizedDescription
如果您的 Error
如此类
enum SystemError: Error {
case databaseFailure(internalCode: Int)
}
let error = SystemError.databaseFailure
// ^^ obviously you’d get this from a callback or `catch` in the real-world
let alert = UIAlertController(…)
alert.message = error.localizedDescription
present(alert)
弹窗将显示
操作无法完成。(MyModule。(0xx10d6b4a44上下文未知)。SystemError错误0。)
但是如果我们使用.legibleLocalizedDescription
import LegibleError
let alert = UIAlertController(…)
alert.message = error.legibleLocalizedDescription
present(alert)
弹窗将显示
操作无法完成。(SystemError.databaseFailure(internalCode: 34))
仍然不太好,但在错误报告中更有用。
如果你想要一个更好的消息,实现LocalizedError
,这将使得localizedDescription
和legibleLocalizedDescription
都返回你指定的字符串
enum SystemError: LocalizedError {
case databaseFailure
var errorDescription: String? {
switch self {
case databaseFailure(let code):
return "A serious database failure occurred. Contact support. (#\(code))"
}
}
}
弹窗将显示
发生了严重的数据库故障。请联系支持人员。(编号34)
LegibleError存在的原因是
- 你无法控制第三方,也无法强迫他们实现
LocalizedError
- 你代码库中的某些错误非常不可能发生,因此“本地化”它们并不是一个好的维护负担。
- 记录错误时,你希望获得完整的信息,而没有任何风险导致本地化版本“落后”,让编译器去做这项工作,在此类情况下使用
legibleDescription
(请参阅下一节)。
可记录的错误描述
这个
let msg = "There was an error (\(error))"
会给你这个
发生了一个错误(databaseFailure)
这会丢失枚举类型的上下文;使用legibleDescription
let msg = "There was an error! \(error.legibleDescription)"
发生了一个错误(SystemError.databaseFailure(internalCode: 34))
legibleDescription
是相对于description
的,而legibleLocalizedDescription
是相对于localizedDescription
的。legibleDescription
始终适合与你,即开发者,沟通发生了哪个错误。在本记录中使用它,并为用户提供一个良好的消息。
Linux上的更好描述
Linux略落后一点,在Linux上通常只能得到“操作无法完成”。我们完全支持Linux。
支持mxcl
嗨,我是Max Howell,我写了很多开源软件,你也许已经在使用它们了(比如Homebrew?)。我全职从事开源工作,这很艰难;目前我的收入低于最低工资。请帮助我继续我的工作,我会非常感激的 x
安装
SwiftPM
package.append(.package(url: "https://github.com/mxcl/LegibleError.git", from: "1.0.0"))
CocoaPods
pod 'LegibleError', '~> 1.0'
Carthage
等待:[Carthage#1945](https://github.com/Carthage/Carthage/pull/1945)。)