试试! &安培;尝试?有什么区别,什么时候使用?

时间:2015-09-04 05:20:22

标签: swift error-handling swift3 swift2

Swift 2.0中,Apple引入了一种处理错误的新方法(do-try-catch)。 几天前,在Beta 6中引入了一个更新的关键字(try?)。 另外,知道我可以使用try!。 3个关键字之间有什么区别?何时使用每个关键字?

1 个答案:

答案 0 :(得分:289)

假设以下投掷功能:

enum ThrowableError : ErrorType { case BadError }

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

尝试

当您尝试调用可能抛出的函数时,您有2个选项。

您可以通过在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.
}

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

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

最后请注意,使用try?注意您丢弃发生的错误,因为它被转换为零。 用试试?当你更多地关注成功和失败时,而不是关注事情失败的原因。