2015-08-13 13 views
15

Używam NSFileManager.contentsOfDirectoryAtPath, aby uzyskać tablicę nazw plików w katalogu. Chcę korzystać z nowej składni do-try-catch do obsługi błędów:Jak znaleźć rodzaj błędów, które metoda może wyrzucić i przechwycić w Swift

do { 

    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 

} catch { 

    // handle errors 
    print(error) // this is the best I can currently do 

} 

mogę imaging, że błąd może być tak, że docsPath nie istnieje, ale nie wiem jak do połowu tego błędu. I nie wiem, jakie mogą wystąpić inne możliwe błędy.

przykład Dokumentacja

Error Handling documentation ma przykład jak ten

enum VendingMachineError: ErrorType { 
    case InvalidSelection 
    case InsufficientFunds(centsNeeded: Int) 
    case OutOfStock 
} 

i

do { 
    try vend(itemNamed: "Candy Bar") 
    // Enjoy delicious snack 
} catch VendingMachineError.InvalidSelection { 
    print("Invalid Selection.") 
} catch VendingMachineError.OutOfStock { 
    print("Out of Stock.") 
} catch VendingMachineError.InsufficientFunds(let amountNeeded) { 
    print("Insufficient funds. Please insert an additional \(amountNeeded) cents.") 
} 

ale nie wiem jak zrobić coś podobnego do łapania błędów normy Typy Swift z metodami używającymi słowa kluczowego throws.

Urządzenie NSFileManager class reference for contentsOfDirectoryAtPath nie określa rodzaju błędów, które mogą zostać zwrócone. Tak więc nie wiem, jakie błędy należy złapać lub jak sobie z nimi poradzić, jeśli je otrzymam.

Aktualizacja

chciałbym zrobić coś takiego:

do { 
    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 
} catch FileManagerError.PathNotFound { 
    print("The path you selected does not exist.") 
} catch FileManagerError.PermissionDenied { 
    print("You do not have permission to access this directory.") 
} catch ErrorType { 
    print("An error occured.") 
} 
+4

Duplikat? [Jak uzyskać listę błędów zgłaszanych przez funkcję?] (Http: // stackoverflow.com/q/34877027/2415822) – JAL

+0

@JAL, Tak, to pytanie jest podobne. W twojej odpowiedzi pokazałeś, jak uzyskać 'NSError', ale nie podałeś żadnych szczegółów na temat tego, jak rozróżniać i obsługiwać różne typy błędów. – Suragch

+0

Również powiązane (zobacz dyskusję w komentarzach): [Znajdź błędy, które funkcja może wyrzucić w Xcode za pomocą Swift] (http://stackoverflow.com/q/36139221/2415822) Naprawdę nie ma sposobu na uzyskanie listy ' ErrorType jest wyrzucane przez funkcję. 'ErrorType' to protokół obiektów, które mogą być wyliczane przez wyrażenie (' NSError' jest zgodne z 'ErrorType', i musisz sprawdzić kod błędu, który powrócił, aby obsłużyć określone błędy). – JAL

Odpowiedz

12

NSError automatycznie łączy się ErrorType gdzie domeny jest typu (np NSCocoaErrorDomain się NSCocoaError) oraz kod błędu się wartość (NSFileReadNoSuchFileError się .FileReadNoSuchFileError)

import Foundation 

let docsPath = "/file/not/found" 
let fileManager = NSFileManager() 

do { 
    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 
} catch NSCocoaError.FileReadNoSuchFileError { 
    print("No such file") 
} catch { 
    // other errors 
    print(error) 
} 

chodzi wiedząc, które błędów może być podana przez konkretne połączenie, pomocna może być tylko dokumentacja. Prawie wszystkie błędy Foundation są częścią domeny NSCocoaError i można je znaleźć w FoundationErrors.h (chociaż istnieją pewne rzadkie błędy, w których Foundation może czasami zwracać błędy POSIX pod NSPOSIXErrorDomain), ale te mogły nie zostać w pełni zmostkowane, więc będziesz musiał się wycofać na temat zarządzania nimi na poziomie NSError.

Więcej informacji można znaleźć w « Using Swift with Cocoa and Objective-C (Swift 2.2) »

2

on powróci NSError:

let fileManager = NSFileManager() 

do { 

    let docsArray = try fileManager.contentsOfDirectoryAtPath("/") 

} catch let error as NSError { 

    // handle errors 
    print(error.localizedDescription) 

    // The file “Macintosh HD” couldn’t be opened because you don’t have permission to view it. 
} 
+0

Więc mówisz, że nie ma listy wyliczeniowej, jak w dokumentach obsługi błędów dla niestandardowych klas? Powinienem wydrukować dowolny opis, który daje mi błąd, a nie próbować zindywidualizowanego zachowania w oparciu o typ błędu? Co zrobić, jeśli chcę coś zrobić, oprócz samego drukowania błędu? – Suragch

+1

Dobrze. Jest to wciąż to samo, co w Obj-C, a jeśli spojrzysz na dokumentację Obj-C, używa NSError, który jest w zasadzie zgodny z resztą struktury Cocoa (Touch). NSError to klasa zgodna z ErrorType. Możesz zrobić więcej, niż tylko wydrukować opis, patrz https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/index.html. – MirekE

+0

Czy istnieje sposób na zrobienie czegoś podobnego do tego, co pokazałem w mojej aktualizacji? – Suragch

0

Co your'e prosząc w "update" część nie jest możliwy. To decyzja o funkcji rzucania, aby poinformować Cię o tym, co może rzucić lub jej nie pokazać, a następnie musisz poradzić sobie z ogólnym błędem.

Wiele funkcji ujawniają informacje o wyrzuconych błędy - na przykład:

func startVPNTunnel() throws 
Description 
Start the process of connecting the VPN 
true if the process of connecting the VPN started successfully, false if an error occurred. 
Parameters 
error 
A pointer to a pointer to an NSError object. If specified and the VPN connection process cannot be started due to an error, this parameter will be set to point to an NSError object containing details about the error. See NEVPNManager Class Reference for a list of possible errors. 

EDIT: możliwa przyczyna to - to jest sposób, funkcja rzucanie można zmienić błędy to rzuca, a wszystkie kod, który wychwyci ten błąd, będzie nadal ważny.

Powiązane problemy