一尘不染

如何发现方法可能会抛出的错误并在Swift中捕获它们

swift

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不存在,但我不知道如何捕获此错误。而且我不知道还会发生什么其他错误。

文档示例

错误处理的文件有这样一个例子

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类型错误。

对的NSFileManager类的引用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.")
}

阅读 186

收藏
2020-07-07

共1个答案

一尘不染

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水平上。

可以在《将Swift与Cocoa和Objective-C结合使用(Swift
2.2)》中
找到更多信息。

2020-07-07