在一个 catch 块中处理多个 swift 错误

Posted

技术标签:

【中文标题】在一个 catch 块中处理多个 swift 错误【英文标题】:Handle multiple swift errors in one catch block 【发布时间】: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 的哪个错误会被抛出? 【参考方案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

【讨论】:

好的,所以寻找可能有意义的错误是我唯一的选择。谢谢你的回答。

以上是关于在一个 catch 块中处理多个 swift 错误的主要内容,如果未能解决你的问题,请参考以下文章

动手动脑-异常处理

在块中修改后未更新 Swift 结构

无法从 Android Material 滑块中删除填充

在 SDL Tridion 2011 的 Dreamweaver 模板构建块中处理多个组件演示

如何使用多个catch块处理异常

多个短期 TPL 数据流与单个长期运行流