试试! 试试? 有什么区别,什么时候使用每个?

在Swift 2.0中 ,Apple引入了一种处理错误的新方法(do-try-catch)。 而且几天前在Beta 6中引入了一个更新的关键字( try? )。 另外,知道我可以使用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() } 

尝试!

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

 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. } 

或者我们可以使用新的真棒守卫关键字:

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

最后一个注意,通过使用try? 注意你丢弃发生的错误,因为它被翻译成零。 使用尝试? 当你更专注于成功和失败,而不是为什么事情失败。