Ho avuto la stessa identica domanda dell'OP. Dal momento che nessuno ha risposto alla domanda come ha chiesto (e anche io), ecco il mio contributo.
In Swift 3 e Xcode 8.3.3 si farebbe quanto segue per trattare le singole eccezioni. Di seguito vi fornirò un esempio con FileManager.
Per prima cosa si dispone solo di un blocco di cattura per rilevare l'errore che il metodo genera. Quindi trasmetti quell'errore come un NSError. Contrariamente al protocollo Error in Swift, NSError è una vera classe di errore. Quindi puoi estrarre il codice di quell'errore in un'istruzione switch. Dovrai sapere da quale dominio il metodo genera l'errore e trovare i codici di errore nel file di intestazione appropriato.
Nell'esempio seguente, gli errori relativi ai file vengono generati in NSCocoaErrorDomain e questi codici di errore sono definiti/elencati in Foundation/FoundationErrors.h.Nel mio computer, si trovano a
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
per le applicazioni MacOS e al
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
per le applicazioni iPhone.
Quindi, ecco un esempio:
let home = FileManager.default.homeDirectoryForCurrentUser
let file = home.appendingPathComponent("file")
do {
let loadedString = try String(contentsOf: file)
}
catch {
let realError = error as NSError // As weird as it looks, Xcode actually wants this forced conversion
print(realError.localizedDescription)
switch realError.code {
case 257: // No permission
handleNoPermission()
case 260: // File not found
handleFileNotFound()
default:
handleUndefinedError()
}
}
Il .localizedDescription
contiene un utente messaggio amichevole nel linguaggio del vostro utente su tale errore. Se il file non viene trovato sopra, stampa: The file “file” couldn’t be opened because there is no such file.
in inglese. È pensato per essere utilizzato direttamente nelle finestre di dialogo degli errori che si presentano all'utente.
È inoltre possibile trovare ulteriori informazioni su ciò che errore viene generato da ogni dominio qui: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
Unfortanely, è necessario controllare la Documentazione (API). Fai attenzione, non c'è eccezione che si lanci, ma lancio di errori. Se stai cercando un modo per organizzare il flusso del tuo codice, usa invece il controllo corretto. L'errore di lancio di cattura è la tua ultima possibilità di recuperare da esso, non sei in grado di recuperare dall'eccezione. – user3441734
[Vedi anche questa domanda correlata e la risposta accettata.] (Http://stackoverflow.com/questions/31977738/how-to-find-the-kind-of-errors-a-method-may-throw-and- catch-them-in-swift) – Suragch