Swift 3中的错误处理

40

我正在将我的代码迁移到Swift 3,并在我的do/try/catch块中看到一堆相同的警告。我想检查一个赋值操作是否返回nil,如果没有工作,则将一些内容打印到控制台。catch块显示它“无法访问,因为在'do'块中没有抛出错误”。我希望使用一个catch块捕获所有错误。

let xmlString: String?
    do{
        //Warning for line below: "no calls to throwing function occurs within 'try' expression
        try xmlString = String(contentsOfURL: accessURL, encoding: String.Encoding.utf8)

        var xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString)
        if let models = xmlDict?["Cygnet"] {
            self.cygnets = models as! NSArray
        }

    //Warning for line below: "catch block is unreachable because no errors are thrown in 'do' block
    } catch {
        print("error getting xml string")
    }

我该如何编写一个适当的try catch块以处理赋值错误?


实际上,try 必须写在抛出方法之前,而不是在包含结果的变量之前 - xmlString = try String(... 但是这个方法在 Swift 3 中真的会 抛出 错误吗? - vadian
唯一的问题是如果它返回了nil的赋值。但是为什么catch块仍然无法访问呢? - Bleep
2
一个 do - catch 块需要至少一个抛出错误的方法。String(contentsOfURL: 似乎没有这样做。顺便说一下:我怀疑 String(contentsOfURL: 在 Swift 3 中是否能编译。 - vadian
1
请阅读与您正在使用的Xcode版本相匹配的文档,以找出正确的语法。Swift 3 beta版中的方法签名可能会有很大的差异。 - vadian
在Swift 3(Xcode Beta 4)中尝试使用xmlString = String(contentsOf: url, encoding: String.Encoding.utf8)来解析XML字符串。 - Willjay
显示剩余2条评论
1个回答

67

你可以通过在找到nil时抛出自己的错误来执行此操作。

具有此类自定义错误:

enum MyError: Error {
    case FoundNil(String)
}
你可以写类似这样的内容:

您可以编写像这样的内容:

    do{
        let xmlString = try String(contentsOf: accessURL, encoding: String.Encoding.utf8)
        guard let xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString) else {
            throw MyError.FoundNil("xmlDict")
        }
        guard let models = xmlDict["Cygnet"] as? NSArray else {
            throw MyError.FoundNil("models")
        }
        self.cygnets = models
    } catch {
        print("error getting xml string: \(error)")
    }

32
展示在捕获异常中,“error"并不需要匹配一个模式,标识符“error”会自动定义,给你点赞(+1)。 - Kaydell
你也可以尝试这样写:var error:NSError? = nil do{ try //抛出错误的方法 }catch let fetchError as NSError{ error = fetchError //处理返回的错误 } - Torongo
@NaGibToroNgo,你明白 OP 正在询问如何处理 do-try-catch 中的 nil 检查吗?你的代码中没有包含任何关于 nil 检查的内容。 - OOPer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接