一种忽略方法抛出的任何错误的优雅方法
Posted
技术标签:
【中文标题】一种忽略方法抛出的任何错误的优雅方法【英文标题】:An elegant way to ignore any errors thrown by a method 【发布时间】:2015-12-23 15:19:58 【问题描述】:我正在删除一个带有 NSFileManager
的临时文件,如下所示:
let fm = NSFileManager()
fm.removeItemAtURL(fileURL)
// error: "Call can throw but it is not marked with 'try'"
我真的不在乎文件在调用时是否存在以及它是否已被删除,就这样吧。
在不使用do/catch
的情况下,告诉 Swift 忽略任何抛出的错误,有什么优雅的方法?
【问题讨论】:
【参考方案1】:如果你不关心成功与否,那么你可以打电话
let fm = NSFileManager.defaultManager()
_ = try? fm.removeItemAtURL(fileURL)
来自 Swift 文档中的 "Error Handling":
您使用
try?
通过将错误转换为可选值来处理错误。 如果在评估try?
表达式时抛出错误,则值 表达式为nil
。
removeItemAtURL()
返回“无”(又名Void
),因此try?
表达式的返回值为Optional<Void>
。
将此返回值分配给 _
可避免 "'try?' 结果未使用” 警告。
如果您只对通话结果感兴趣而不在意
抛出的特定错误然后您可以测试
try?
对 nil
的返回值:
if (try? fm.removeItemAtURL(fileURL)) == nil
print("failed")
更新:从 Swift 3 (Xcode 8) 开始,您不需要虚拟分配,至少在这种特殊情况下不需要:
let fileURL = URL(fileURLWithPath: "/path/to/file")
let fm = FileManager.default
try? fm.removeItem(at: fileURL)
编译时没有警告。
【讨论】:
谢谢。这无疑是最优雅的方式。但它仍然看起来很奇怪和不一致,因为表达式包含可选链接,如“foo?.bar()”不会引发关于返回和未使用的可选 Void 值的警告。为什么要“尝试”?做?我希望 Apple 能通过更多的 Swift 版本来解决这个问题。 感谢您的精彩解释。 !! 我仍然习惯于从 ObjC 切换到 Swift。关于问号,这里到底发生了什么:_ = try? fm.removeItemAtURL(fileURL)
。如果抛出错误,这是告诉编译器只使用 nil 吗?
@pnizzle:是的,如上所述:“如果在评估尝试时抛出错误?表达式,表达式的值为 nil。”以上是关于一种忽略方法抛出的任何错误的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章
如何找到方法可能抛出的错误类型并在 Swift 中捕获它们 [重复]