Swift 3中的错误处理

Ble*_*eep 39 error-handling try-catch swift swift3

我正在将我的代码迁移到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")
    }
Run Code Online (Sandbox Code Playgroud)

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

OOP*_*Per 61

你可以做的一种方法就是在找到nil时抛出你自己的错误.

有了这种你自己的错误:

enum MyError: Error {
    case FoundNil(String)
}
Run Code Online (Sandbox Code Playgroud)

你可以写这样的东西:

    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)")
    }
Run Code Online (Sandbox Code Playgroud)

  • +1用于证明在"错误"不需要匹配模式的catch中,只是自动定义了名为"error"的标识符. (32认同)