【发布时间】: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