Miałem dokładnie to samo pytanie co OP. Ponieważ nikt tak naprawdę nie odpowiedział na pytanie, o które prosił (a także ja), oto mój wkład.
W Swift 3 i Xcode 8.3.3 można wykonać następujące czynności w celu potraktowania poszczególnych wyjątków. Poniżej podam przykład z FileManager.
Najpierw będziesz miał tylko jeden blok catch, który wykryje błąd, który metoda rzuca na ciebie. Następnie rzucisz ten błąd jako NSError. W przeciwieństwie do protokołu Error w Swift, NSError jest klasą błędów REAL. Następnie możesz wyodrębnić kod tego błędu w instrukcji switch. Będziesz musiał wiedzieć, z której domeny metoda generuje błąd, a następnie znaleźć kody błędów w odpowiednim pliku nagłówkowym.
W poniższym przykładzie błędy związane z plikami są zgłaszane w NSCocoaErrorDomain, a kody błędów są zdefiniowane/wymienione w pliku Foundation/FoundationErrors.h.W moim komputerze, znajdują się one w
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
dla MacOS aplikacjach i na
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
dla iPhone apps.
Więc tutaj jest przykład:
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()
}
}
.localizedDescription
zawiera przyjazny dla użytkownika wiadomości w języku Twojego użytkownika na temat tego błędu. Jeśli plik nie zostanie znaleziony powyżej, wydrukuje: The file “file” couldn’t be opened because there is no such file.
w języku angielskim. Jest przeznaczony do użycia bezpośrednio w oknach dialogowych błędów, które prezentujesz swojemu użytkownikowi.
Można również znaleźć więcej informacji na temat tego, co zostanie zgłoszony błąd przy każdej domeny tutaj: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
Unfortanely, trzeba sprawdzić Dokumentation (API). Bądź ostrożny, nie ma wyjątków, rzucanie, ale błąd rzucania. Jeśli szukasz sposobu na uporządkowanie przepływu kodu, użyj zamiast tego odpowiedniego sprawdzenia. Błąd rzucania rzucania jest ostatnią szansą na odzyskanie, nie możesz wyjść z wyjątku. – user3441734
[Zobacz także powiązane pytanie i zaakceptowaną odpowiedź.] (Http://stackoverflow.com/questions/31977738/how-to-find-the-kind-of-errors-a-method-may-throw-and- catch-them-in-swift) – Suragch