首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 > try, try! & try?有什么区别,什么时候使用它们?

try, try! & try?有什么区别,什么时候使用它们?
EN

Stack Overflow用户
提问于 2018-05-02 08:30:03
回答 1查看 0关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-02 17:48:25

假设以下投掷函数:

代码语言:javascript
复制
enum ThrowableError : ErrorType { case BadError }

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

try

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

您可以通过在do-catch块中围绕您的呼叫来承担处理错误的责任:

代码语言:javascript
复制
do {
    let result = try doSomething()
}
catch {
    // Here you know about the error
    // Feel free to handle to re-throw
} 

或者只是尝试调用该函数,并将错误传递给调用链中的下一个调用者:

代码语言:javascript
复制
func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}

try!

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

代码语言:javascript
复制
let result = try! doSomething() // if an error was thrown, CRASH!

try?

在Xcode 7 beta 6中引入了一个新关键字。它返回一个可选项,用于解开成功的值,并通过返回nil来捕获错误。

代码语言:javascript
复制
if let result = try? doSomething() {
    // doSomething succeeded, and result is unwrapped.
} else {
    // Ouch, doSomething() threw an error.
}

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

代码语言:javascript
复制
guard let result = try? doSomething() else {
    // Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档