【问题标题】:How do I get the error message in Swift 2.0?如何在 Swift 2.0 中获取错误消息?
【发布时间】:2015-12-21 20:56:26
【问题描述】:

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

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

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

之前我用过 NSError 和它的 description 属性,但现在我不知道了。

【问题讨论】:

标签: ios swift error-handling try-catch swift2


【解决方案1】:

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

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

【讨论】:

  • @redent84:任何 ErrorType 都会自动桥接到 NSError,这在“Using Swift with Cocoa and Objective-C”一书中有记载。
  • 或者只是catch let error as NSError { ...},例如(例如)stackoverflow.com/questions/30954722/…
  • 谢谢我没有看到任何信息表明错误是这样传递的,我只发现了几个捕获特定错误或根本没有错误的捕获。我可以在 3 分钟内接受
  • 你会得到一些标准的 localizedDescription 用于 Swift-only ErrorType
  • 现在任何Error 都有默认的localizedDescription(见链接)。但从我的测试来看,它似乎只是为我们做了let nsError = error as NSErrordeveloper.apple.com/reference/swift/error/….
【解决方案2】:

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

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

操作无法完成。 (域错误代码。)

例如下面的代码:

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)
}

将打印

操作无法完成。 (AwfulError 错误 1。)

【讨论】:

    【解决方案3】:

    尽管问题标题指定了 Swift 2,但此答案适用于 Swift 3。

    正如@redent84 指出的那样,由于 Swift 2,Error 对象可能是自制的。这是我编写的一种方法,用于分析和打印未指定任何特定错误类型的“catch”语句中可用的默认错误对象:

       // 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)
        }
    

    【讨论】:

      【解决方案4】:

      如何获取 userInfo 中的错误message

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

      【讨论】:

        猜你喜欢
        • 2013-02-07
        • 2021-11-03
        • 2016-08-02
        • 2018-11-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2017-01-25
        相关资源
        最近更新 更多