Swift 2 iOS 9不捕获尝试崩溃,发现意外的零

Swift 2 iOS 9不捕获尝试崩溃,发现意外的零,swift,nsurlsession,swift2,ios9,Swift,Nsurlsession,Swift2,Ios9,我正在尝试熟悉swift2和ios9的新do-catch语句 我的问题是,当NSURLSession发生错误时,数据参数返回nil,而error返回一些东西。在iOS 8中,这是预期的功能,我们只是使用if语句来确定数据是否为零 然而,对于docatch,有一个新的try关键字,我认为它是为了查看某个东西是否有效,如果不起作用,那么默认为catch 然而,由于数据为零,我得到了一个意外的崩溃。这是预期的功能,为什么当我的try方法失败时不调用catch 我正在使用NSURLSession从API

我正在尝试熟悉swift2和ios9的新
do-catch
语句

我的问题是,当NSURLSession发生错误时,数据参数返回nil,而error返回一些东西。在iOS 8中,这是预期的功能,我们只是使用if语句来确定数据是否为零

然而,对于
do
catch
,有一个新的
try
关键字,我认为它是为了查看某个东西是否有效,如果不起作用,那么默认为
catch

然而,由于数据为零,我得到了一个意外的崩溃。这是预期的功能,为什么当我的
try
方法失败时不调用
catch

我正在使用NSURLSession从API中提取数据

我创建了一个DataTask,请求如下:

 let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
        print(request)
        print(response)
        print(error)

        do {

            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
就在这里崩溃,因为数据!是零。。因为存在NSURLSession错误

            print(jsonResult)




        } catch {
            print(error)
        }

    })
    task.resume()

这是因为
catch
只捕获函数“抛出的内容”

NSJSONSerialization
抛出,但强制展开空的可选文件不会抛出,它总是崩溃

使用
if let
或新的
guard
功能安全地打开值

do {
    if let myData = data, let jsonResult = try NSJSONSerialization.JSONObjectWithData(myData, options: []) as? NSDictionary {
        print(jsonResult)
    }
} catch {
    print(error)
}

因此,假设我使用一个保护语句来展开数据。如果error包含和error,并且数据为nil,那么guard语句将退出当前范围,并且我不会看到我的错误。。我想看看。对吗?如果你想使用
guard
,你不必在
do catch
中这样做,因此你可以在
任务
中之前这样做,并从
session.dataTaskWithRequest
给出的“error”变量中获益注意:catch中的“error”变量不是同一个变量,它是由
catch
自动使用的通用变量。因此,在
if let
语句中,如果data==nil,则不会执行
try
,因此不会
抛出
,也不会调用
catch
,所以我不会犯错误。对吗?原来的
if错误!=nil{print(data)}
优于?但数据为零和NSJSONSerialization失败导致的错误不相关。:)功能与以前没有任何变化。如果允许,您可以始终使用
。。。ELSE
要创建一个分支,在该分支中处理的“数据”为零,这与JSON的
do try catch
有所不同。有时周一并不是最好的一天。伟大的这是有道理的。