如何查找方法可能抛出的错误类型并在 Swift 中捕获它们[重复]

问题描述 投票:0回答:3

我正在使用

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

contentsOfDirectoryAtPath

NSFileManager 类参考没有说明可能返回哪种错误。所以我不知道要捕获哪些错误,也不知道如果遇到错误如何处理它们。

更新

我想做这样的事情:

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.")
}
ios macos swift error-handling
3个回答
18
投票

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
中找到(尽管有一些罕见的错误,基金会有时也会在
NSPOSIXErrorDomain
下返回 POSIX 错误),但这些错误可能尚未完全桥接,因此您将不得不在
NSError
级别上管理它们。


3
投票

它将返回 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
投票

您在“更新”部分所要求的内容是不可能的。 这是抛出函数的决定,让您知道它可能抛出什么,或者不显示它,然后您需要处理一般错误。

许多函数确实会揭示有关抛出错误的信息 - 例如:

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.

编辑:可能的原因 - 也就是说,抛出函数可以更改它抛出的错误,并且捕获这些错误的所有代码仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.