斯威夫特 2 尝试/捕捉

Posted

技术标签:

【中文标题】斯威夫特 2 尝试/捕捉【英文标题】:Swift 2 try/catch 【发布时间】:2015-08-20 23:43:50 【问题描述】:

我已经开始将我的一个项目转换为 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 类型的抛出函数的无效转换 -> 无效'到非抛出函数类型'(NSData?,NSURLResponse?, NSError?)-> 无效'

我确实发现了:

 catch _ 

有效,但对我有很多好处。

我是遗漏了什么还是应该提交错误?

(这是 Xcode 7b5)

【问题讨论】:

【参考方案1】:

dataTaskWithRequest 的完成处理程序并非像NSJSONSerializationJSONObjectWithData 那样抛出错误,其签名为:

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")

【讨论】:

完美。除非我抛出自定义 ErrorType,否则我不会想到这样做。谢谢!!

以上是关于斯威夫特 2 尝试/捕捉的主要内容,如果未能解决你的问题,请参考以下文章

尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS

斯威夫特 2:任何对象?不能转换为 NSString

NSCollectionView 斯威夫特

斯威夫特 UITextView

如何在 Webview 上显示网站的特定部分? (Xcode 7 斯威夫特 2)

如何使地图引脚动画下降?斯威夫特 2.2 IOS 9