2016-08-08 53 views
33

Tôi đang di chuyển mã của mình sang Swift 3 và thấy một loạt các cảnh báo tương tự với các khối do/try/catch của tôi. Tôi muốn kiểm tra xem một nhiệm vụ không trả về nil và sau đó in một cái gì đó ra bàn điều khiển nếu nó không hoạt động. Khối catch nói rằng "không thể truy cập được vì không có lỗi nào được ném vào khối 'do'". Tôi muốn bắt tất cả các lỗi với một khối catch.Xử lý lỗi trong 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") 
    } 

Làm cách nào để viết một khối bắt thử thích hợp có thể xử lý các lỗi gán?

+0

Trên thực tế 'cái try' phải được viết ngay trước khi phương pháp ném chứ không phải trước biến chứa kết quả - 'xmlString = try String (...' nhưng phương thức đó thực sự ** ném ** một lỗi trong Swift 3? – vadian

+0

Điều duy nhất là nếu nó trả về một phép gán của nil. vẫn không thể truy cập được? – Bleep

+2

Một khối lệnh 'do - catch' req uires ít nhất một phương pháp mà ném một lỗi. 'String (contentsOfURL:' dường như không làm như vậy. Bằng cách này: Tôi nghi ngờ rằng 'String (contentsOfURL:' sẽ biên dịch trong Swift 3 – vadian

Trả lời

54

Một cách bạn có thể làm là tự ném các lỗi của mình vào việc tìm kiếm số không.

Với việc có loại hình này lỗi của riêng bạn:

enum MyError: Error { 
    case FoundNil(String) 
} 

Bạn có thể viết một cái gì đó như thế này:

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 để chứng minh rằng trong một cú đánh rằng "lỗi" không cần phải khớp với mẫu, số nhận dạng được gọi là "lỗi" chỉ được xác định tự động – Kaydell

+0

Bạn cũng có thể thử tính năng này : 'var lỗi: NSError? = Nil làm { thử // phương pháp của bạn mà ném Lỗi } catch để fetchError như NSError { lỗi = fetchError // Phát với lỗi trở } ' – Torongo

+0

@NaGibToroNgo, làm bạn hiểu rằng OP được hỏi làm thế nào để xử lý 'nil' kiểm tra trong do-try-catch? Mã của bạn không chứa bất cứ điều gì về kiểm tra 'nil'. – OOPer