Dal documentation:
Gestione degli errori
La gestione degli errori è il processo di rispondere e il recupero da condizioni di errore nel programma. Swift fornisce il supporto di prima classe per lanciare, catturare, propagare e manipolare gli errori recuperabili in fase di runtime.
...
Rappresentazione e Generazione di errori
In Swift, errori sono rappresentati da valori di tipi conformi alle protocollo ErrorType
. Questo protocollo vuoto indica che un tipo può essere utilizzato per la gestione degli errori.
(Nota: ErrorType
è stato rinominato Error
a Swift 3)
Quindi, con try/catch
voi gestire errori Swift (valori di tipi che sono conformi al protocollo ErrorType
), che sono throw
n. Questo è completamente estraneo agli errori di runtime e alle eccezioni di runtime (e anche non correlato a NSException
dalla libreria Foundation).
Nota che la documentazione Swift sulla gestione degli errori non ha nemmeno usare la parola "eccezione", con l'unica eccezione di (sottolineatura mia) a (!):
NOTA movimentazione
errore in Swift è simile alla gestione delle eccezioni in altre lingue , con l'uso delle parole chiave try, catch e throw.A differenza della gestione delle eccezioni in molte lingue, inclusa la correzione dell'errore C-Object in Swift non è richiesto lo svolgimento dello stack di chiamate, un processo che può essere molto costoso dal punto di vista computazionale. Pertanto, le prestazioni di un'istruzione di lancio sono paragonabili a quelle di un'istruzione di reso .
La srotolamento di opzionali che sono nil
non fa throw
un errore Swift (che potrebbe essere propagata) e non può essere trattato con try
.
è necessario utilizzare le tecniche ben note come optional, concatenamento opzionale vincolante, controllando contro nil
ecc
fonte
2016-01-06 09:16:07
Non sono sicuro che lanciare un errore con 'throw' (che è ciò che causa la propagazione di errori all'interno di tale funzione) è la stessa cosa che accade quando si forza a scartare un' nil'. Penso di aver letto da qualche parte che è implementato come un 'assert()'. –
Questo spiegherebbe, ma è terribile. Forse c'è un argomento per questo, ma in un linguaggio che supporta le eccezioni sembra incoerente. – Greg
@ Greg: Nicolas ha ragione. Si noti che try/catch gestisce gli errori Swift * * (i valori conformi a 'ErrorType' che vengono lanciati). Questo è * completamente non correlato * agli errori di runtime o alle eccezioni. (La documentazione non menziona nemmeno la parola "eccezione" in relazione a throw/try/catch, solo "Gestione degli errori".) –