当前位置: 首页 > 面试题库 >

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

马边浩
2023-03-14
问题内容

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.")
}

问题答案:

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)》中
找到更多信息。



 类似资料:
  • 问题内容: 这可能很容易。我们知道运算符会对整数进行整数运算(环绕),而运算符会导致错误。 这是什么错误?我无法捕获它,也无法将其变成可选的: 我很确定,这种错误与(除以零)中的错误相同,但我不知道是否可以捕获此类错误。我缺少什么简单的东西?能不能被困住?如果是这样,怎么办? 问题答案: 在异常和运行时错误之间进行区分。引发异常并可以将其捕获。运行时错误会使您的程序停滞不前。添加和获取溢出是简单而

  • 问题内容: 我在让Chai的node.js应用程序进行测试时遇到问题。测试会因引发的错误而不断失败,但是如果我将测试用例包装在try和catch中并断言所捕获的错误,它将起作用。 难道不喜欢的工作,我认为它应该还是什么? 失败: 问题答案: 您必须将一个函数传递给。像这样: 执行此操作的方式将传递给call 的 结果。但是要测试是否抛出了某些东西,您必须将一个函数传递给,该函数会自行调用。上面使用

  • 最近我被要求在我的代码中捕获可抛出的内容。所以我们遇到了一个争论,我们是否应该这样做,我给出了一个OutOfMemoryError的例子,在这种情况下,即使我们捕获到错误,我们的代码也不会被进一步处理。 所以为了测试这个理论,我们为它创建了示例代码。 在Wed Jun 16 14:20:41 IST 2021时间运行测试 try Block内部 catch Block内部 Java.lang.Ou

  • 在我的Node.js应用程序的测试中,让Chai的 工作时遇到了问题。测试在抛出的错误上不断失败,但是如果我将测试用例包装在try和catch中,并在捕获的错误上断言,它就会工作。 不像我认为的那样工作吗? 失败:

  • 出于某种原因,这段代码给了我一个无法捕捉的异常错误。catch块似乎没有捕捉到错误。try catch块的作用范围是否如此,以至于我不能在嵌套函数中抛出一个错误,然后期望它被一个作用范围更高的catch语句捕获?我正在使用的应用程序中的一些敏感数据已经被删除,但它预期leadInfo[ 0 / 1]将是一个32个字符的字母数字字符串,我从URL参数中提取。 这里的根本问题是我的AJAX调用从API

  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输