【问题标题】:Handling errors from Swift 2.0 String object functions处理来自 Swift 2.0 字符串对象函数的错误
【发布时间】:2016-01-25 20:21:14
【问题描述】:

我是 Swift 2.0 编程的新手(来自 C# 世界),我只是想编写一个函数来解析字符串中的一些数据并返回结果。该函数本身运行良好,但作为该过程的一部分,如果输入字符串的格式不正确,字符串函数可能会抛出并出错,我想为该函数准备一个包罗万象的错误处理程序来处理这个问题。这是没有错误处理的原始函数的代码:

// Parses the numeric value of the BATT return string
private func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString("%") {
        let start = inputStr.startIndex.advancedBy(5)
        let end = inputStr.characters.indexOf("%")?.advancedBy(-1)

        if end != nil {
            return Int(inputStr.substringWithRange(start...end!))!
        }else{
            return 0
        }
    }else{
        printStatus("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

如您所见,我确实对可以输入的字符串进行了基本的完整性检查,但这绝不是详尽的。我主要关心的是,如果 is 通过了检查,但会导致 advanceBy() 或任何内部字符串函数失败,会发生什么?

我确实尝试将代码包装在一个 do-catch 块中,如下所示,

private func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString(" ") {
        do {
            let start = try inputStr.startIndex.advancedBy(5)
            let end = try inputStr.characters.indexOf("%")?.advancedBy(-1)

            if end != nil {
                return try Int(inputStr.substringWithRange(start...end!))!
            }else{
                return 0
            }
        } catch let error as NSError {
            printStatus(error.description)
        }
    }else{
        printStatus("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

然后我收到警告,在 do 块内的所有行旁边,用 try 关键字标记,

在 'try' 表达式中不会调用抛出函数

然后,catch 关键字旁边还有另一个警告,

'catch' 块无法访问,因为 'do' 块中没有引发错误

这没有意义,因为如果输入了无效的字符串,该函数显然会使程序崩溃。这在 C# 中处理起来非常简单,但在 Swift 2.0 中处理这个问题的正确方法是什么?

【问题讨论】:

  • 你能提供一个输入字符串的例子吗?
  • 没关系,我有答案
  • 对于其他可能感兴趣的人,输入字符串的示例是“BATT:xx%”,其中 xx 可以是单个、两位或三位数字。现在,我确实认识到这个特定的功能很简单,可以编写一些验证逻辑,而无需捕获错误,但我主要想知道在您无法轻松验证输入和需要的情况下该怎么做捕捉错误。

标签: string error-handling swift2


【解决方案1】:

所以问题 String startIndex 和 characters 函数不会抛出,并且可以被 swift 捕获的异常 do try catch 块。有关详细信息,请参阅 The Swift Programming Language (Swift 2.1) - Error Handling 文档。

所以我重写了代码来处理整数的解析而不崩溃

func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString("%") {
        let start = inputStr.startIndex.advancedBy(5)
        let indexOfPercent = inputStr.characters.indexOf("%")

        if (indexOfPercent != nil) {
            let end = indexOfPercent!.advancedBy(-1)
            let batteryLevel = inputStr.substringWithRange(start...end)

            if let level = Int(batteryLevel) {
                return level
            }
        }

        return 0

    } else {
        print("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

【讨论】:

  • 您好文森特,感谢您提出的解决方案。然而,这引出了一个更基本的问题:在 Swift 中,对于不抛出任何错误的函数,你如何处理错误?谢天谢地,这个有一个解决方法,但是如果您无法完全验证输入,您会怎么做?
  • 这是一个很好的问题,我真的相信Apple仍然在思考如何做一个整体的错误处理。根据他们的文档,它确实应该使用 do/try 块来处理,但在 advancedBy 等情况下,我们暂时只进行简单的验证
  • 更多关于这个话题的信息在这里stackoverflow.com/questions/24010569/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多