[英]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
JSONObjectWithData
的NSJSONSerialization
,其簽名是:
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.