Aggiornato per Swift 5.1
Assumi la seguente funzione di lancio:
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)
}
}
provare
Hai 2 opzioni quando provi a chiamare una funzione che può essere lanciata.
Puoi assumerti la responsabilità di gestire gli errori circondando la chiamata all'interno di un blocco 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)
}
Oppure prova a chiamare la funzione e passa l'errore al chiamante successivo nella catena di chiamate:
func doSomeOtherThing() throws -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
provare!
Cosa succede quando si tenta di accedere a un accessorio implicitamente non scartato con un valore al suo interno? Sì, vero, l'app CRASH! Lo stesso vale per provare! fondamentalmente ignora la catena di errori e dichiara una situazione "do or die". Se la funzione chiamata non ha generato alcun errore, tutto va bene. Ma se fallisce e genera un errore, l'applicazione si bloccherà semplicemente .
let result = try! doSomething() // if an error was thrown, CRASH!
provare?
Una nuova parola chiave che è stata introdotta in Xcode 7 beta 6. Restituisce un facoltativo che scartare i valori di successo e rileva l'errore restituendo zero.
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
Oppure possiamo usare guard:
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
Un'ultima nota qui, usando la try?
nota che stai scartando l'errore che si è verificato, poiché è tradotto in uno zero. Usa provare? quando ti stai concentrando di più sui successi e sugli insuccessi, non sul motivo per cui le cose sono fallite.
Usando l'operatore di coalescenza ??
Puoi usare l'operatore di coalescenza ?? con provare? per fornire un valore predefinito in caso di errore:
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
let result = try doSomething() // Not within a do-catch block
) deve essere chiamato all'interno di un metodo dichiarato comethrows
, giusto? Quindi, sedoSomething()
fallisce, anche il metodo esterno (a sua volta)?