文档和流行博客建议使用 do-catch 进行 Swift 错误处理,并处理 ErrorType 枚举或 NSError 实例。
ErrorType 枚举和 NSError 实例在 try catch 块中是否互斥?如果没有,如何实现一个同时抛出两者的函数?
我已将 NSError 实例关联到枚举,如下所示,这似乎有效,但这是否是返回详细错误信息的事实上的方式?
enum Length : ErrorType {
case NotLongEnough(NSError)
case TooLong(NSError)
}
func myFunction() throws {
throw Length.NotLongEnough(NSError(domain: "domain", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey: "Not long enough mate"]))
}
do {
try myFunction()
} catch Length.NotLongEnough(let error) {
print("\(error)")
}
此示例展示了如何将 ErrorType 转换为 NSError。
do {
let str = try NSString(contentsOfFile: "Foo.bar",
encoding: NSUTF8StringEncoding)
}
catch let error as NSError {
print(error.localizedDescription)
}
我找不到符合 NSString ErrorType 的错误枚举,所以我们应该假设它将是一个 NSError 实例吗?当然,我们可以肯定地运行代码,但文档肯定应该让我们知道。 (我很高兴我可能误读了文档)
任何 ErrorType 都可以成功转换为NSError
,这意味着如果您想要将 ErrorType 作为优先级处理,或者特定的 ErrorType 符合 Swift 类型,那么您应该在转换为的情况之前有这些情况NSError
(这将再次为所有人带来成功ErrorType
符合蚂蚁类型)。
我不确定苹果现阶段是否就如何处理这种二元性表达了任何规范的意见,但我个人尝试坚持ErrorType
使 Swift 类型符合我自己的错误,并且只涉及强制转换NSError
当我想基于某些 Cocoa 或第 3 方做出条件行为时NSError
基于代码,其中域和代码组合对我的逻辑有意义(例如,如果可以从日志记录或响应中过滤掉特定错误)。
Swift 中现有的错误处理工具的问题主要是由于无法判断方法抛出的错误类型,以及ErrorType
缺乏一些关键的上下文信息NSError
每次您想要展示时都可以提供额外的定制工作ErrorType
以某种方式出现在用户界面中。与 NSError 不同,ErrorType 没有办法传递 UI 预期信息,例如“原因”、“恢复建议”或“描述”。看来 Swift 3 还没有解决这个问题(最近在 Swift 开发邮件列表上对此进行了一些讨论)。
关于“我找不到符合 NSString ErrorType 的错误枚举”,我真的不确定我是否正确理解了这个短语,或者它的整体措辞是否正确,但也许以下内容是相关的:
我个人遵循制定我的惯例ErrorType
实施CustomStringConvertible
并使用description
属性来描述人类(UI 意图)可读的错误描述。这绝不是完美的,尤其是在 OSX 上NSResponder
足够好给你presentError
如果您填写描述和恢复建议信息,该方法会生成一个非常漂亮且清晰的错误对话框。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)