web-dev-qa-db-ja.com

Swift 3のエラー処理

コードをSwift 3に移行すると、do/try/catchブロックで同じ警告が多数表示されます。割り当てがnilを返さないかどうかを確認し、それが機能しない場合はコンソールに何かを出力します。 catchブロックは、「doブロックでエラーがスローされないため、到達不能です」と言います。 1つの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ブロックを作成するにはどうすればよいですか?

38
Bleep

できる方法の1つは、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)")
    }
61
OOPer