Swift 2:调用可以抛出,但它没有用'try'标记并且错误没有被处理

Posted

技术标签:

【中文标题】Swift 2:调用可以抛出,但它没有用\'try\'标记并且错误没有被处理【英文标题】:Swift 2 : Call can throw, but it is not marked with 'try' and the error is not handledSwift 2:调用可以抛出,但它没有用'try'标记并且错误没有被处理 【发布时间】:2016-04-01 22:23:17 【问题描述】:

我从 Swift 2 开始,在尝试完成尝试使用 iTunes API 的函数时遇到此错误。

    func searchItunesFor(searchTerm: String) 
    let itunesSearchTerm = searchTerm.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil)

    if let escapedSearchTerm = itunesSearchTerm.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 
        let urlPath = "http://itunes.apple.com/search?term=\(escapedSearchTerm)&media=software"
        let url = NSURL(string: urlPath)
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url!, completionHandler: data, response, error -> Void in
            print("Task completed")
            if(error != nil) 
                print(error!.localizedDescription)
            
            var err: NSError?
            if let jsonResult = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary 
                if(err != nil) 
                    print("JSON Error \(err!.localizedDescription)")
                
                if let results: NSArray = jsonResult["results"] as? NSArray 
                    dispatch_async(dispatch_get_main_queue(), 
                        self.tableData = results
                        self.appsTableView!.reloadData()
                    )
                
            
        )

        task.resume()
    

我得到错误:“”调用可以抛出,但它没有用“try”标记,错误没有被处理“”在这一行

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary 
            if(err != nil) 

这个问题的解决方案是什么? 谢谢

【问题讨论】:

Swift 2: Call can throw, but it is not marked with 'try' and the error is not handled的可能重复 【参考方案1】:

这是因为并非所有NSData 都可以转换为 JSON 对象。用这个替换那个 JSON 解析部分:

do 
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as? NSDictionary 
        dispatch_async(dispatch_get_main_queue(), 
            self.tableData = results
            self.appsTableView!.reloadData()
        )
    
 catch let jsonError as NSError 
    print(jsonError.localizedDescription)

【讨论】:

【参考方案2】:

你也可以像这样使用 somehting.. 使用,ObjectMapper,SwiftyJSON,Alafir

        guard let jsonResponce = try? JSON(data: data) else 
            print("\n\n\n\n error :\(AppAlertMsg.kErrorMsg) \n\n URL:\(urlString) \n\n paramaters:\(JSON(paramaters as Any))\n\n\n\n")
            failure("error")
            return
        

【讨论】:

以上是关于Swift 2:调用可以抛出,但它没有用'try'标记并且错误没有被处理的主要内容,如果未能解决你的问题,请参考以下文章

“调用可以抛出,但它没有用'try'标记并且错误没有处理“[重复]

Swift 2 jSON Call 可以抛出,但没有用 try 标记

Swift 2.2 HealthKit - 调用可以抛出,但它没有标有“尝试”并且错误未处理

Swift 2.2 HealthKit - 调用可以抛出,但它没有标有“尝试”并且错误未处理

我调用了 timeBeginPeriod(1),但它没有用

调用可以抛出,但它没有标记为'try'并且没有处理错误:NSRegularExpression