2016-08-08 132 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