【问题标题】: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 忽略任何抛出的错误,有什么优雅的方法?

【问题讨论】:

    标签: ios swift exception exception-handling


    【解决方案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。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2012-02-28
    相关资源
    最近更新 更多