如何获得 Swift 2.0 中的错误消息?

How do I get the error message in Swift 2.0?

我在 Swift 1.2: NSURLConnection.sendSynchronousRequest(:_:_:_) 中经常使用这种方法,但在 iOS9 中显然已弃用。但是它仍然有效,但现在它使用新的 Swift 2.0 错误处理,我不知道如果失败我将如何获得错误消息,例如。如果时间用完了。

我知道我必须将它放入 do-catch 中,然后在方法之前说尝试,但我不知道如何捕获错误消息。

do {
    let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    return data 
}
catch _ {
    return nil
}

之前我用过NSError,然后是它的描述属性,但现在我一点头绪都没有了。

使用自动 error 变量,如果您愿意,可以将其转换为 NSError

catch {
    let nsError = error as NSError
    print(nsError.localizedDescription)
}

您现在可以抛出继承 ErrorType 的任何对象,并在 catch 语句中提供自定义处理。您还可以将错误转换为 NSError 以访问 localizedDescription 以处理第三方错误。

转换枚举 ErrorType 将生成一个 NSError,其中 domain 等于枚举名称,code 等于枚举值和一个自动生成的 localizedDescription 格式如下:

The operation couldn’t be completed. (DOMAIN error CODE.)

例如下面的代码:

enum AwfulError: ErrorType {
    case Bad
    case Worse
    case Terrible
}

func throwingFunction() throws {
    throw AwfulError.Worse
}

do {
    try throwingFunction()
}
catch AwfulError.Bad {
    print("Bad error")
}
catch let error as NSError {
    print(error.localizedDescription)
}

将打印

The operation couldn’t be completed. (AwfulError error 1.)

尽管问题标题指定 Swift 2,但此答案针对 Swift 3。

正如@redent84 指出的那样,由于 Swift 2 错误 object 可能是 home-made 错误。这是我编写的用于分析和打印 "catch" 语句中可用的默认错误 object 的方法,该语句未指定任何特定的错误类型:

   // Method to print an unknown Error type object to the system output.
   static func printCaughtError(_ unknownError : Error) {
      let objectDescription = String(describing: unknownError)
      let localizedDescription = unknownError.localizedDescription
      if localizedDescription != "" {
         if localizedDescription.contains(objectDescription) {
            print(localizedDescription)
            return
         }
         if !objectDescription.contains(localizedDescription) {
            print(objectDescription + ": " + localizedDescription)
            return
         }
      }
      print(objectDescription)
   }

那么你可以这样称呼它:

    catch {
       printCaughtError(error)
    }

如何获取 userInfo 中的错误 message:

let errorMessage = (error as NSError).userInfo["message"] as? String