do - try - catch代码不会尝试或捕获。只是做

时间:2018-02-23 11:40:46

标签: swift error-handling try-catch optional

感谢您提前获得任何帮助。

url会话与连接完美配合,它将错误打印为nil。但没有它它打印.localizedDescription就好了,并向我显示正确的错误,但随后继续执行do {try}并在try行中出现此错误:

  

线程6:致命错误:打开时出乎意料地发现nil   可选值

现在我甚至不确定这是否与错误处理有关。感谢任何帮助,了解最新情况或只是解决问题!

func getData(completion: (() -> ())?) {

    let urlString = URL(string: "https://api.coinmarketcap.com/v1/ticker/")

    URLSession.shared.dataTask(with: urlString!, completionHandler: { (data, response                                                                                                         , error) in

        print("before entering do-try-catch", error?.localizedDescription)

        do {

            //create Dictionary
            print("downloading content")

            self.coinData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]]

            //set connection status
            self.connection = true

            //update tableView
            DispatchQueue.main.async {
                completion?()
            }

        } catch {

            print("catch", error.localizedDescription)

            //set connection status
            self.connection = false

            //update tableView
            DispatchQueue.main.async {
                completion?()
            }
        }
    }).resume()
}

2 个答案:

答案 0 :(得分:2)

Thread 6: Fatal error: Unexpectedly found nil while unwrapping an Optional value是初学者的常见问题。

您尝试使用不存在的数据。 例如,在您的代码中,您强制执行try JSONSerialization.jsonObject(with: data!)

datanil时,代码将崩溃。

开头URLSession.shared.dataTask(with: urlString!, completionHandler: { (data, response, error) {}

urlString不是有效的网址时,代码将崩溃。 (在这种情况下,网址似乎有效)。

有关详细信息,请查看此处: https://stackoverflow.com/a/24034551/4420355

尝试以下剪切它应该工作

if let data = data {
 self.coinData = try JSONSerialization.jsonObject(with: data) as? [[String:Any]]
     //... work with coinData
 }

答案 1 :(得分:1)

崩溃的原因是因为data是可选的,它应该是nil或具有某些值。在线

self.coinData = try JSONSerialization.jsonObject(with: data!) as! [[String:Any]]

编译器认为:

让我们来看看并解开这个Optianal变量。但它的nil,没有"没有"!那我该怎么解开呢?让我们崩溃并抛出致命错误信息。

如何通过可选绑定轻松避免这种情况:

if let data = data {
....do something with data
} else {
...print error message
}

有关更多信息,请查看这个精彩的答案。  https://stackoverflow.com/a/32170457/3046686