在一个 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 语句抛出的错误类型是什么?
提前致谢, 乔纳斯
【问题讨论】:
查看FileManager
的moveItem
方法的文档。最后有一个关于 Swift 错误处理的讨论。查看那里显示的链接。请参阅Error Handling 之一。它甚至显示了处理来自moveItem
的不同错误的示例。
谢谢。这有帮助,但实际上并没有办法找出具体抛出了哪些错误类型,是吗?幸运的是,带有moveItem
的那个在示例中,但是对于createDirectory
、removeItem
、contentsOfDirectory
等。我不得不猜测,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 错误的主要内容,如果未能解决你的问题,请参考以下文章