Ответ 1
Используйте автоматическую переменную error
, и вы можете отправить ее на NSError
, если хотите:
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
Я очень сильно использовал этот метод в 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 и затем его описание, но теперь у меня нет подсказки.
Используйте автоматическую переменную error
, и вы можете отправить ее на NSError
, если хотите:
catch {
let nsError = error as NSError
print(nsError.localizedDescription)
}
Теперь вы можете выбросить любой объект, наследующий 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.)
Несмотря на заголовок вопроса, определяющий 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)
}