Ios 斯威夫特:N错误现在应该被视为遗产吗?

Ios 斯威夫特:N错误现在应该被视为遗产吗?,ios,swift,error-handling,Ios,Swift,Error Handling,文档和流行博客建议使用do catch进行快速错误处理,并处理ErrorType enum或NSError实例 ErrorType枚举和NSError实例在try-catch块中是否相互排斥?如果不是,如何实现一个同时抛出这两个参数的函数 我已经将一个NSError实例与这样的枚举相关联,这似乎是可行的,但这是返回详细错误信息的实际方式吗 enum Length : ErrorType { case NotLongEnough(NSError) case TooLong(NSEr

文档和流行博客建议使用do catch进行快速错误处理,并处理ErrorType enum或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实例?我们当然可以运行代码,但是文档应该让我们知道。(我很感激我可能误读了文档)

任何错误类型都可以成功转换为
NSError
,这意味着如果您想将错误类型作为优先级处理,或者处理符合特定错误类型的Swift类型,您应该在转换为
NSError
之前先处理这些情况(对于所有
ErrorType
conformant类型,这同样会成功)

我不确定苹果在现阶段是否就如何处理这种二元性发表了任何规范性意见,但就我个人而言,我试图坚持使用
ErrorType
符合我自己错误的Swift类型,当我想基于某个cococoa或第三方做出有条件的行为时,只涉及到转换到
NSError
n错误
基于域和代码组合对我的逻辑有某种意义的代码(例如,如果可以从日志或响应中过滤出特定错误)

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

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


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

NSError
类在接口和任何符合
ErrorType
的类都可以强制转换为
NSError
。下面介绍了这些特性

您可以安全地坚持使用
ErrorType
,特别是如果您计划仅与Swift进行互操作

enum CommonError: ErrorType {
    case InternalInconsistency(String)
}

func boom() throws {
    throw CommonError.InternalInconsistency("Boom!")
}

do {
    try boom()
} catch {
    print(error) // InternalInconsistency("Boom!")
    print(error as NSError) // Error Domain=CommonError Code=0 "(null)"
}

do {
    try boom()
} catch let CommonError.InternalInconsistency(msg) {
    print("Error: \(msg)") // Error: Boom!
}

有人系统性地否决了我所有的帖子吗?我不明白为什么这些天人们都否决了我发布的东西!嗯,现在有人否决了所有的东西,即使问题问得很好,而且没有一秒钟的谷歌搜索。奇怪的事儿……谢谢你的详细回复,非常感谢。我想我们合作了uld typealias我们自己的“userInfo”字典或包含错误信息的元组,并将其传递到ErrorType的关联枚举中。但必须针对列出的每个案例执行此操作。现在将关注邮件列表。再次感谢。