ios - Swift:NSError 现在应该被视为遗留问题吗?

标签 ios swift error-handling

文档和热门博客建议使用 do-catch 完成 Swift 错误处理,并处理 ErrorType 枚举或 NSError 实例。

ErrorType 枚举和 NSError 实例在 try catch block 中是否互斥?如果不是,您如何实现同时抛出两者的函数?

我像这样将一个 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 的 Ant 类型,这同样会成功)。

我不确定 Apple 在现阶段是否就如何处理这种二元性发表了任何规范的意见,但我个人尝试坚持使用 ErrorType 符合我的 Swift 类型自己的错误,并且仅当我想基于某些 Cocoa 或第 3 方基于 NSError 的代码进行条件行为时才涉及转换为 NSError ,其中域和代码组合对我来说有点意义逻辑(例如,如果可以从日志记录或响应中过滤掉特定错误)。

Swift 中用于错误处理的现有设施的问题主要是由于无法判断方法抛出的错误类型,加上 ErrorType 缺少 中包含的一些关键上下文信息>NSError 每次您想以某种方式在 UI 中向用户显示 ErrorType 时,它都会提供额外的定制工作。与 NSError 不同,ErrorType 没有办法传递 UI 预期信息,例如“原因”或“恢复建议”,或者实际上是“描述”。看起来 Swift 3 也不会解决这个问题(最近在 Swift 开发邮件列表上对此进行了一些讨论)。

关于“我找不到符合 NSString 的 ErrorType 的错误枚举”,我真的不确定我是否正确理解了这个短语,或者它的整体措辞是否正确,但也许以下内容是相关的:

我个人遵循使我的 ErrorType 实现 CustomStringConvertible 并使用 description 属性来描述人类(UI 预期)可读描述的惯例的错误。这绝不是完美的,尤其是在 OSX 上,NSResponder 很好地为您提供了 presentError 方法,如果您填写描述和恢复,它会生成一个非常漂亮和清晰的错误对话框建议信息。

关于ios - Swift:NSError 现在应该被视为遗留问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071160/

相关文章:

ios - 将 Unity 项目与现有 Xcode swift 项目组合时出现问题

ios - Xcode Swift - 在苹果 map 上查看输入的邮政编码

iOS 摇一摇手势 - 双摇

php - 全文搜索查询生成错误,为什么?

ios - 如何在上一个选定行的 didDeselectRow 处知道下一个选定行的 IndexPath?

iphone - 使用捏合手势放大 UIImageView

ios - Swift:删除状态栏时出错

ios - 如何将类型从 OpaquePointer 更改为我的数据模型变量?

sharepoint - 如何定向到自定义错误页面?

android - Android-EditText setError直到EditText模糊并重新聚焦后才会显示