Обновлено для Swift 5.1
Предположим следующую функцию броска:
enum ThrowableError: Error {
case badError(howBad: Int)
}
func doSomething(everythingIsFine: Bool = false) throws -> String {
if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.badError(howBad: 4)
}
}
пытаться
У вас есть 2 варианта, когда вы пытаетесь вызвать функцию, которая может выдать.
Вы можете взять на себя ответственность за обработку ошибок , окружив свой вызов блоком do-catch:
do {
let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
// Here you know about the error
// Feel free to handle or to re-throw
// 1. Handle
print("Bad Error (How Bad Level: \(howBad)")
// 2. Re-throw
throw ThrowableError.badError(howBad: howBad)
}
Или просто попробуйте вызвать функцию и передать ошибку следующему абоненту в цепочке вызовов:
func doSomeOtherThing() throws -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
пытаться!
Что происходит, когда вы пытаетесь получить доступ к неявно развернутому необязательному файлу с нулем внутри него? Да, правда, приложение будет CRASH! То же самое и с попыткой! он в основном игнорирует цепочку ошибок и объявляет ситуацию «сделай или умри». Если вызванная функция не выдает никаких ошибок, все идет хорошо. Но если произошел сбой и возникла ошибка, ваше приложение просто вылетит .
let result = try! doSomething() // if an error was thrown, CRASH!
пытаться?
Новое ключевое слово, которое было введено в бета-версии Xcode 7. Оно возвращает необязательное значение, которое разворачивает успешные значения, и возвращает ошибку, возвращая nil.
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
Или мы можем использовать охрану:
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
Последнее замечание здесь, используя try?
примечание, что вы отбрасываете произошедшую ошибку, поскольку она переведена в ноль. Используйте попробовать? когда вы концентрируетесь больше на успехах и неудачах, а не на том, почему что-то не получилось.
Использование оператора объединения
Вы можете использовать оператор объединения? с пробовать? предоставить значение по умолчанию в случае отказа:
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
let result = try doSomething() // Not within a do-catch block
) должен вызываться из метода, который объявлен какthrows
, верно? Так что, еслиdoSomething()
не получается, то работает ли и внешний метод (в свою очередь)?try?
с??
таким образом, чтобы он позволил вам определить значение по умолчанию в одной строке:let something:String = (try? whateverIfItThrows()) ?? "Your default value here"