【问题标题】:Handle multiple swift errors in one catch block在一个 catch 块中处理多个 swift 错误
【发布时间】:2018-01-12 19:28:01
【问题描述】:

我有一个关于快速错误处理的问题。在我的快速脚本中,我必须对可能引发异常的 FileManager 执行多项操作。现在我的第一个想法是,将它们全部放在一个 do-catch 块中。

do {
    let fileManager = FileManager.default
    try fileManager.moveItem(atPath: destination, toPath: "\(destination).old")
    try fileManager.createDirectory(atPath: destination, withIntermediateDirectories: false)
    ...
} catch {
    print(error)
    exit(EXIT_FAILURE)
}

现在的问题是,我无法在 catch 块中确定哪个语句引发了错误。本地化描述也不是很有帮助(“恢复备份时出错!”)。

我也无法真正找出抛出的错误是哪种类型,因为我在 FileManager 文档中找不到任何相关内容。

我想一种可行的方法是将每个语句放在它自己的嵌套 do-catch 块中,但在我看来这看起来非常混乱且难以阅读。

所以我的问题是,如果有另一种方法来确定错误类型或将其抛出到 catch 块中的语句,或者找出每个 FileManager 语句抛出的错误类型是什么?

提前致谢, 乔纳斯

【问题讨论】:

  • 查看FileManagermoveItem 方法的文档。最后有一个关于 Swift 错误处理的讨论。查看那里显示的链接。请参阅Error Handling 之一。它甚至显示了处理来自moveItem 的不同错误的示例。
  • 谢谢。这有帮助,但实际上并没有办法找出具体抛出了哪些错误类型,是吗?幸运的是,带有moveItem 的那个在示例中,但是对于createDirectoryremoveItemcontentsOfDirectory 等。我不得不猜测,CocoaError 的哪个错误会被抛出?

标签: swift error-handling nsfilemanager


【解决方案1】:

首先,不,您无法判断哪个语句引发了错误,您必须将每个语句包装在 do/catch 块中。

其次,文档没有说明函数会抛出哪些错误,因此您只需测试看起来正确的错误,如下所示:

do {
    let fileManager = FileManager.default
    try fileManager.moveItem(atPath: destination, toPath: "\(destination).old")
    try fileManager.createDirectory(atPath: destination, withIntermediateDirectories: false)
    ...
} catch CocoaError.fileNoSuchFile {
    // Code to handle this type of error
} catch CocoaError.fileWriteFileExists {
    // Code to handle this type of error
} catch {
    // Code to handle any error not yet handled
}

【讨论】:

  • 好的,所以寻找可能有意义的错误是我唯一的选择。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多