【问题标题】:Error Handling in Swift 3Swift 3 中的错误处理
【发布时间】:2016-12-14 14:30:20
【问题描述】:

我正在将我的代码迁移到 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 必须写在 throwing 方法之前,而不是在包含结果的变量之前 - xmlString = try String(... 但该方法真的 throw 在斯威夫特 3?
  • 唯一的事情是它返回一个 nil 的赋值。为什么 catch 块仍然无法访问?
  • do - catch 块至少需要一种引发错误的方法。 String(contentsOfURL: 似乎没有这样做。顺便说一句:我怀疑String(contentsOfURL: 会在 Swift 3 中编译
  • 那么 if (xmlString != nil) 会更好地检查分配吗?
  • 请阅读与您使用的 Xcode 版本相匹配的文档以找出正确的语法。 Swift 3 beta 中的方法签名可以有很大的不同。

标签: swift error-handling try-catch swift3


【解决方案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)")
    }

【讨论】:

  • +1 用于证明在捕获中“错误”不需要匹配模式,称为“错误”的标识符只是自动定义的。
  • 你也可以试试这个:var error:NSError? = nil do{ try //your method that throws Error }catch let fetchError as NSError{ error = fetchError //Play with the returned error }
  • @NaGibToroNgo,您知道 OP 询问如何处理 nil 签入 do-try-catch 吗?您的代码不包含任何关于 nil 检查的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2018-02-18
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多