簡體   English   中英

斯威夫特 2 嘗試/捕獲

[英]Swift 2 try/catch

我已經開始將我的一個項目轉換為 Swift 2,但我遇到了這個問題。 下面開始這個塊是完全有效的try / catch ,實際上它是由 Xcode 遷移工具生成的。

do {
       requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: [])
} catch var error as NSError {
      requestError = error
      requestData = nil
}

如果我在閉包中使用相同的代碼,例如dataTaskWithRequest我會收到錯誤消息。 錯誤是在任務分配上,但它是導致它的捕獲。 以下也有效,但我沒有捕獲錯誤。

let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, taskError) -> Void in
    if taskError != nil {
        NSLog("Error making request: " + taskError!.localizedDescription)
    } 
    else {
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
            if let parseJSON = json as NSDictionary? {
                // do some parsing here
            }
        } 
        catch {
           NSLog("Error in JSON serialization")
     }
  }
})
task.resume()

但是如果我嘗試使用以下方法捕獲錯誤:

} catch let e as NSError {

我收到此錯誤:

從“(_, _, _) throws -> Void”類型的拋出函數到非拋出函數類型“(NSData?, NSURLResponse?, NSError?) -> Void”的無效轉換

我確實發現:

} catch _ {

有效,但對我有很多好處。

我錯過了什么還是應該提交錯誤?

(這是 Xcode 7b5)

dataTaskWithRequest的完成處理程序不是為了拋出像NSJSONSerialization JSONObjectWithDataNSJSONSerialization ,其簽名是:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject

執行以下操作會起作用(與您嘗試過的相同):

catch _

但這不會為我們提供有關拋出錯誤的任何詳細信息,即來自class func JSONObjectWithData

因此,我們需要一種方法來使用不可拋出的dataTaskWithRequest同時保留拋出的數據 - JSONObjectWithData

我嘗試了以下方法:

catch let error as NSError
{
     //error specific to JSON serialization
     NSLog("Error in JSON serialization \(error)")
}
catch
{
     //exhaust the error
     NSLog("Some error")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM