【问题标题】:Swift 2.2 error handling by try block通过 try 块处理 Swift 2.2 错误
【发布时间】:2016-04-26 10:48:54
【问题描述】:

几天前我刚刚开始学习 Swift。在我的 Xcode 游乐场中,我有以下代码:

//: Playground - noun: a place where people can play

import UIKit

enum VendingMachineError: ErrorType {
    case InvalidSelection
    case InsufficientFunds(coinsNeeded: Int)
    case OutOfStock
}


func requestBeverage(code: Int, coins: Int) throws {
    guard code > 0 else  {
        throw VendingMachineError.InvalidSelection
    }
    if coins < 2 {
        throw VendingMachineError.InsufficientFunds(coinsNeeded: 3)
    }
    guard coins > 10 else {
        throw VendingMachineError.OutOfStock
    }

    print("everything went ok")
}



try requestBeverage(-1, coins: 4)
print("finished...")

如果我尝试运行它,什么也不会发生。但我希望打印“完成...”,因为在我的逻辑中,它尝试做某事,失败,然后程序将继续......

所以问题是,为什么程序没有继续,以及如何用尽可能少的单词告诉代码在出错的情况下继续?

提前致谢

【问题讨论】:

  • 是否打印了“一切正常”?
  • 你确定是 Swift 3 吗?据我所知,Swift 3 甚至还没有处于测试阶段(它将在 WWDC 2016 之后,并且可能会在 9 月左右发布)。最有可能是 Swift 2.2(当前版本)。
  • 苹果什么时候发布了swift 3.0?我错过了那个版本吗?请澄清我的疑问。
  • 我明白了。我收到了 ++ deprecation 错误,所以我认为它是 3.0。但我认为你是对的。
  • @OWADVL 弃用意味着计划在未来版本(在本例中为 Swift 3.0)中删除某些内容,但在当前版本(Swift 2.2)中仍然可以正常工作。编译器只是警告你,你应该准备好你的代码 Swift 3.0(这样你就不会在它发布时处理大量突然的错误)。

标签: swift try-catch swift-playground swift2.2


【解决方案1】:

您可以使用 do/catch 单独捕获所有错误:

do {
    try requestBeverage(-1, coins: 4)
} catch VendingMachineError.InvalidSelection {
    print("Invalid selection")
} catch VendingMachineError.OutOfStock {
    print("Out of stock")
} catch VendingMachineError.InsufficientFunds(let coinsNeeded) {
    print("You need \(coinsNeeded) more coins")
} catch {
    // an unknown error occured
}

print("finished...")

或者,如果您只关心是否抛出错误而不关心哪个错误,则使用try?

func requestSomeBeverage() {
    guard (try? requestBeverage(-1, coins: 4)) != nil else {
        print("An error has occured")
        return
    }
}

requestSomeBeverage()
print("finished...")

如果您绝对确定不会引发错误,并且希望在发生异常时引发异常,请使用try!(但在大多数情况下,不要):

try! requestBeverage(-1, coins: 4)
print("finished...")

【讨论】:

    【解决方案2】:

    你需要捕捉错误

    ... 
    
    do {
      try requestBeverage(-1, coins: 4)
    } catch {
      print(error)
    }
    print("finished...")
    

    请参阅 Swift 语言指南中的 Error Handling

    编辑:您可以将整个表达式写在一行中;-)

    do { try requestBeverage(-1, coins: 4) } catch { print(error) }
    

    【讨论】:

    • 好的,但是您的解决方案有 6 行代码。 ...1-2 行中有什么东西吗?
    • 实际上还有 4(!) 行。它出什么问题了?当然你可以将docatch 子句分别放在一行,但这并不能真正提高性能;-)
    • @TimVermeulen 是的,我想这是尝试的解决方案? ...但这是正常的做法吗?或者你会写一个 do/catch...
    • do/catch 通常是要走的路,因为它允许您catch 个别错误。如果你只关心是否抛出错误而不关心哪个错误,那么使用try?
    • @TimVermeulen 如果你想回答我会接受的。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多