Оновлено для 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)
}
}
спробуйте
У вас є два варіанти, коли ви намагаєтесь викликати функцію, яка може кинути.
Ви можете взяти на себе відповідальність за обробку помилок , оточуючи свій дзвінок у межах блоку, що робить улов:
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()
}
спробуйте!
Що відбувається, коли ви намагаєтесь отримати доступ до неявно розгорнутого факультативу з нулем всередині нього? Так, правда, додаток буде РОЗКРИТИ! Те саме стосується і спробу! він в основному ігнорує ланцюжок помилок і оголошує ситуацію "зроби чи помри". Якщо викликана функція не кинула жодних помилок, все буде добре. Але якщо вона не вдалася і виникла помилка, ваша програма просто вийде з ладу .
let result = try! doSomething() // if an error was thrown, CRASH!
спробувати?
Нове ключове слово, яке було введено в Xcode 7 beta 6. Він повертає необов’язкове, що розгортає успішні значення та виявляє помилку, повертаючи нуль.
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()не вдається, то чи зовнішній метод теж (по черзі)?