gpt4 book ai didi

swift - 试试!并尝试?有什么区别,什么时候使用它们?

转载 作者:IT王子 更新时间:2023-10-29 04:55:20 28 4
gpt4 key购买 nike

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

最佳答案

针对 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)
}
}

尝试

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

您可以通过将调用包含在 do-catch block 中来承担处理错误的责任:

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() <b><i>throws</i></b> -> 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? 请注意,您正在丢弃发生的错误,因为它被转换为 nil。用试试?当您更多地关注成功和失败,而不是失败的原因时。

使用合并运算符 ??

您可以使用合并运算符 ??试试?在失败时提供默认值:

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

关于swift - 试试!并尝试?有什么区别,什么时候使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32390611/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com