2016-08-08 117 views
33

我将我的代码迁移到Swift 3,并看到一堆与我的do/try/catch块相同的警告。我想检查一个赋值是否不返回nil,如果它不起作用,则将其输出到控制台。 catch块表示“无法访问,因为在'do'块中没有引发错误”。我想用一个catch块捕捉所有错误。错误处理Swift 3

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块来处理赋值错误?

+0

其实'try'必须投掷方法前右前书面而非包含结果的变量 - 'xmlString = try String(...'但是这样做真的**抛出** Swift 3中的错误? – vadian

+0

唯一的是如果它返回一个赋值为nil。为什么catch块仍然无法访问? – Bleep

+2

'do - catch' block req要求至少有一个引发错误的方法。 'String(contentsOfURL:'似乎并没有这样做顺便说一句:我怀疑'String(contentsOfURL:'将在if(xmlString!= nil)是否更好地检查赋值的情况下在Swift 3 – vadian

回答

54

你可以做的一个方法是抛出你自己的错误找到零。

采用具有这种自己的错误:

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

+1用于证明在“错误”不需要匹配模式的捕获中,称为“错误”的标识符只是自动定义的。 – Kaydell

+0

您也可以尝试:var错误:NSError? =零 做{ 尝试//你的方法抛出错误 }赶上让fetchError为NSError { 错误= fetchError //与返回的错误 播放}' – Torongo

+0

@NaGibToroNgo,你明白的是,OP是询问如何在do-try-catch中处理'nil'检查?你的代码不包含任何关于'nil'检查的内容。 – OOPer