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

Abd*_*man 162 error-handling swift swift2 swift3

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

Abd*_*man 303

假设以下投掷功能:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

尝试

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

您可以通过在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)
}
Run Code Online (Sandbox Code Playgroud)

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

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}
Run Code Online (Sandbox Code Playgroud)

尝试!

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

let result = try! doSomething() // if an error was thrown, CRASH!
Run Code Online (Sandbox Code Playgroud)

尝试?

Xcode 7 beta 6中引入的新关键字.它返回一个可选的解包成功值,并通过返回nil捕获错误.

if let result = try? doSomething() {
    // doSomething succeeded, and result is unwrapped.
} else {
    // Ouch, doSomething() threw an error.
}
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用新的awesome guard关键字:

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

最后一点,try?请注意您正在丢弃发生的错误,因为它被转换为零.用试试?当你更专注于成功和失败时,而不是为什么事情会失败.

  • 你也可以使用`try?`和`??`所以它可以让你在一行中定义一个默认值:`let something:String =(try?whateverIfItThrows())?? "你的默认值在这里"` (7认同)
  • @BenButterworth 老实说不是,只要您记住只有 `try` 必须包含在 do-catch 中,而其他两个则不然,您就可以认识到 `!` 和 `?` 作为标准可选运算符。 (2认同)