Оновлено для 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()
не вдається, то чи зовнішній метод теж (по черзі)?