我NSFileManager.contentsOfDirectoryAtPath用来获取目录中文件名的数组。我想使用新的do-try- catch语法来处理错误:
NSFileManager.contentsOfDirectoryAtPath
do-try- catch
do { let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) } catch { // handle errors print(error) // this is the best I can currently do }
我可以想象出一个错误可能是docsPath不存在,但我不知道如何捕获此错误。而且我不知道还会发生什么其他错误。
docsPath
该错误处理的文件有这样一个例子
enum VendingMachineError: ErrorType { case InvalidSelection case InsufficientFunds(centsNeeded: Int) case OutOfStock }
和
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.") }
但是我不知道如何捕捉具有使用throws关键字的方法的标准Swift类型错误。
throws
该对的NSFileManager类的引用contentsOfDirectoryAtPath不说,可能会返回什么样的错误。因此,我不知道要捕获什么错误,或者如果得到它们,该如何处理。
contentsOfDirectoryAtPath
我想做这样的事情:
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.") }
NSError自动桥接到ErrorType域变为类型(例如NSCocoaErrorDomain变为CocoaError)和错误代码变为值(NSFileReadNoSuchFileError变为.fileNoSuchFile)的位置
NSError
ErrorType
NSCocoaErrorDomain
CocoaError
NSFileReadNoSuchFileError
.fileNoSuchFile
import Foundation let docsPath = "/file/not/found" let fileManager = FileManager() do { let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) } catch CocoaError.fileNoSuchFile { print("No such file") } catch let error { // other errors print(error.localizedDescription) }
至于知道哪个错误可以通过特定的调用返回,只有文档可以提供帮助。几乎所有Foundation错误都是该CocoaError域的一部分,并且可以在中找到FoundationErrors.h(尽管Foundation中有时会返回POSIX错误,NSPOSIXErrorDomain但也存在一些罕见的错误),但是这些错误可能尚未完全消除,因此您必须依靠管理它们在NSError水平上。
FoundationErrors.h
NSPOSIXErrorDomain
可以在《将Swift与Cocoa和Objective-C结合使用(Swift 2.2)》中找到更多信息。