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

SWIFT 2.0中,Apple引入了一种处理错误的新方法(do-try-catch)。 几天前,在Beta6中引入了一个更新的关键字(try?)。 此外,我知道我可以使用try!。 这三个关键字之间有什么区别,什么时候使用?

55023 次浏览

针对SWIFT 5.1更新

假设以下抛出函数:

enum ThrowableError: Error {


case badError(howBad: Int)
}


func doSomething(everythingIsFine: Bool = false) throws -> String {


if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.badError(howBad: 4)
}
}

尝试

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

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

do {
let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
// Here you know about the error
// Feel free to handle or to re-throw


// 1. Handle
print("Bad Error (How Bad Level: \(howBad)")


// 2. Re-throw
throw ThrowableError.badError(howBad: howBad)
}

或者尝试调用该函数,并向调用链中的下一个调用者将错误传递下去

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:

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

最后要注意的是,通过使用try?,注意您正在丢弃发生的错误,因为它被转换为nil. 使用尝试?当你更多地关注成功和失败,而不是失败的原因时。

使用合并运算符?

可以使用合并运算符?用试试?要在失败时提供默认值,请执行以下操作:

let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value