一种忽略方法抛出的任何错误的优雅方法

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。”

以上是关于一种忽略方法抛出的任何错误的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章

不抛出的方法的快速错误处理[重复]

捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?

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

当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?

用 Jest 抛出的异步测试

测试 Mocha 中抛出的错误 [重复]