swift – 试试,试试! &try?有什么区别,什么时候使用每个?

Swift 2.0,苹果推出了一种新的方式来处理错误(do-try-catch)。
几天前在Beta 6中引入了一个更新的关键字(试试?)。
此外,知道我可以使用try!
3个关键字之间有什么区别,以及何时使用每个?
假设以下投掷函数
enum ThrowableError : ErrorType { case BadError }

func doSomething() throws -> String {
    if everythingIsFine {
        return "Everything is ok"
    } else {
        throw ThrowableError.BadError
    }
}

尝试

当你尝试调用一个可能抛出的函数时,你有两个选项。

您可以通过在do-catch块中包围您的调用来负责处理错误

do {
    let result = try doSomething()
}
catch {
    // Here you kNow about the error
    // Feel free to handle to re-throw
}

或者只是尝试调用函数,并将错误传递给调用链中的下一个调用者:

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}

尝试!

当你试图访问一个隐藏的解包可选的内部有一个nil会发生什么?是的,真的,应用程序会崩溃!
同样的尝试!它基本上忽略了错误链,并声明了一个“做或死”的情况。如果被调用函数没有抛出任何错误,一切都很好。但如果它失败并抛出一个错误,你的应用程序将会崩溃。

let result = try! doSomething() // if an error was thrown,CRASH!

尝试?

一个在Xcode 7 beta 6中引入的新关键字。它返回一个可选的展开成功值,并通过返回nil来捕获错误

if let result = try? doSomething() {
    // doSomething succeeded,and result is unwrapped.
} else {
    // Ouch,doSomething() threw an error.
}

或者我们可以使用新的awesome guard关键字:

guard let result = try? doSomething() else {
    // Ouch,doSomething() threw an error.
}
// doSomething succeeded,and result is unwrapped.

最后一点要注意,通过使用try?请注意,您将丢弃发生的错误,因为它被翻译为零。使用try?当你更多地关注成功和失败,而不是为什么失败。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...