Подтвердить что ты не робот

Обработка ошибок в Swift 3

Я переношу свой код на Swift 3 и вижу кучу одинаковых предупреждений с моими блоками do/try/catch. Я хочу проверить, не присваивает ли задание ниль, а затем распечатывает что-то на консоли, если оно не работает. Блок 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")
    }

Как я могу написать правильный блок catch try, который обрабатывал бы ошибки присваивания?

4b9b3361

Ответ 1

Один из способов, которым вы можете сделать - это сбросить свои собственные ошибки при поиске нулевого значения.

Имея такую ​​собственную ошибку:

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)")
    }