Swift:NSError现在应该被认为是遗产吗?

5 error-handling ios swift

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

在try catch块中,ErrorType枚举和NSError实例是否互斥?如果没有,你如何实现抛出两者的函数?

我已经将一个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)")
}
Run Code Online (Sandbox Code Playgroud)

此示例显示如何将ErrorType强制转换为NSError.

do {
    let str = try NSString(contentsOfFile: "Foo.bar",
                           encoding: NSUTF8StringEncoding)
}
catch let error as NSError {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

我找不到符合NSString的ErrorType的错误枚举,所以我们应该假设它是一个NSError实例吗?当然,我们可以运行代码以确保,但文档肯定应该让我们知道.(我很欣赏我可能会误读文档)

wer*_*ver 0

NSError类采用ErrorType接口,任何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!
}
Run Code Online (Sandbox Code Playgroud)