如何在Swift 2.0中收到错误消息?

时间:2015-09-24 09:45:38

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

我在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然后使用它的描述属性之前,但现在我没有任何线索。

3 个答案:

答案 0 :(得分:36)

使用自动error变量,如果您愿意,可以将其投射到NSError

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

答案 1 :(得分:4)

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

投放枚举ErrorType将生成NSError domain等于枚举名称,code等于枚举值和自动生成的localizedDescription使用以下格式:

  

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

例如,以下代码:

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

答案 2 :(得分:1)

尽管标题指定了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)
    }