Как получить сообщение об ошибке в Swift 2.0?

Я очень сильно использовал этот метод в Swift 1.2: NSURLConnection.sendSynchronousRequest(:_:_:_), но это явно не рекомендуется в iOS9. Он все еще работает, но теперь он использует новую Swift 2.0 Error Handling, и я не знаю, как я получу сообщение об ошибке, если это не удастся, например. если время истекает.

Я знаю, что я должен поместить его в уловку, а затем сказать, попробуйте до metho, но я не знаю, как поймать сообщение об ошибке.

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

До того, как я использовал NSError и затем его описание, но теперь у меня нет подсказки.

Ответы

Ответ 1

Используйте автоматическую переменную error, и вы можете отправить ее на NSError, если хотите:

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

Ответ 2

Теперь вы можете выбросить любой объект, наследующий ErrorType, и предоставить произвольную обработку в предложении catch. Вы также можете отправить сообщение об ошибке в NSError для доступа к localizedDescription для обработки ошибок сторонних разработчиков.

При переводе enum ErrorType будет создан NSError с domain, равным имени перечисления, code, равному значению перечисления и автоматически сгенерированному localizedDescription со следующим форматом:

Операция не может быть завершена. (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)
}

Будет напечатан

Операция не может быть завершена. (Ошибка 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)
    }