Swift:解析数字字符串时如何捕获异常?

时间:2017-10-21 17:57:09

标签: swift exception

在C#或Java中,通常解析数字字符串会引发格式异常。但是,以下代码未捕获错误。有什么问题?

func getInt(_ data:String)->Int
{
    do
    {
        return try Int(data)!
    }
    catch
    {
        return -1;
    }
}

var a = "x123"
var b:Int = getInt(a)
print("Result: " + b)

3 个答案:

答案 0 :(得分:4)

你的方法完全错了。 Int初始化器返回一个可选的Int,所以这里是你如何使用它:

if let converted = Int (data) {
    // Yes, it was converted
} else {
    // No, conversion failed. 
}

或者

guard let converted = Int (data) else {
    // Conversion failed
    return
}

// Continue using "converted". 

try不会捕获任何异常,因为不会抛出任何异常。 Int(data)返回一个可选的Int,换句话说,返回Int或nil。它永远不会抛出。抓住没有例外。拥有一个函数getInt只能执行Int()所做的只是添加完全不必要的复杂性。创建抛出异常的函数getInt更糟糕。

答案 1 :(得分:2)

不要明确展开Int(data)!,而是使用有利于您的nil

func getInt(_ data: String) -> Int {
    return Int(data) ?? -1
}

顺便说一下,在更为宏大的计划中,存在选项,这样你就不必使用"魔术数字"例如-1表示缺失值。如果可能,重写调用此方法的代码,以便在无法解析字符串时接受nil值。

答案 2 :(得分:1)

在Swift中,只有throwcatch的方法。 Int初始值设定项不会throw

Swift模式是选项

func getInt(_ data:String) -> Int?
{
    return Int(data)
}

let a = "x123"
if let b = getInt(a) {
    print("Result: \(b)")
} else {
    print("No result")
}

或者您可以返回非可选项并使用nil合并运算符处理可选的错误

func getInt(_ data:String) -> Int
{
    return Int(data) ?? -1
}

let a = "x123"
let b = getInt(a)
print("Result: \(b)")

或制作方法can throw

enum MyError : Error {
   case conversionError
}

func getInt(_ data:String) throws -> Int
{
    guard let result = Int(data) else { throw MyError.conversionError }
    return result

}

let a = "x123"
do { 
    let b = try getInt(a)
    print("Result: \(b)")
} catch MyError.conversionError {
    print("Could not convert the string '\(a)' to integer")
} 

请阅读Swift Language Guide

中有关选项的部分