2016-08-08 18 views
33

Kodum Swift 3'e geçiyorum ve aynı/birkaç uyarıları benim/try/catch bloklarımla görüyorum. Bir ödevin sıfırlanıp geri dönmediğini kontrol edip çalışmazsa konsola bir şeyler yazdırmak istiyorum. Yakalama bloğu, "do 'bloğunda hiçbir hata atılmadığı için erişilemiyor" diyor. Tüm hataları bir catch bloğuyla yakalamak istiyorum.Swift'te hata işleniyor 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") 
    } 

Atama hatalarını ele alacak düzgün bir try catch bloğu nasıl yazarım?

+0

Aslında 'try' önce yerine doğru atma yönteminden önce yazılmalıdır:

enum MyError: Error { case FoundNil(String) } 

Böyle bir şey yazabilirsiniz: Kendi hata bu tür having ile

sonucu içeren değişken - 'xmlString = String (...' yi deneyin ancak bu yöntem Swift 3'teki bir hatayı * attı mı? – vadian

+0

Tek şey, eğer bir nil atamasını döndürüyorsa. Yine de ulaşılamıyor musunuz? – Bleep

+2

A 'do - catch' blok req Bir hata atan en az bir yöntem uyandırır. Dize (contentOfURL: 'bunu yapmak için görünmüyor. Bu arada: Şüphesiz String (contentOfURL:' Swift 3 – vadian

cevap

54

Tek yapabileceğiniz şey, kendi hatalarınızı nil bulma konusunda atmaktır.

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

Bir yakalamada "hatanın" bir desenle eşleşmesi gerekmediğini göstermek için +1, "hata" adı verilen tanımlayıcı otomatik olarak tanımlanır. – Kaydell

+0

Ayrıca bunu deneyebilirsiniz : var hatası: NSError? = nil yapmak yakalamak NSError olarak fetchError izin {Hata atar // yönteminiz deneyin} { hata = fetchError // döndürülen hata ile oynayın} ' – Torongo

+0

@NaGibToroNgo, OP nasıl soruyor anlıyoruz yapmak 'nil' yap-try-yakalamak kontrol etmek? Kodunuz 'nil' kontrolüyle ilgili hiçbir şey içermiyor. – OOPer

İlgili konular