在
Swift 2.0,苹果推出了一种新的方式来处理错误(do-try-catch)。
几天前在Beta 6中引入了一个更新的关键字(试试?)。
此外,知道我可以使用try!
3个关键字之间有什么区别,以及何时使用每个?
几天前在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?当你更多地关注成功和失败,而不是为什么失败。