swift 4支持异常处理吗?

时间:2018-06-12 11:46:22

标签: swift exception-handling

我的Swift程序崩溃,处理崩溃是他们的任何方式,我尝试异常处理我没有得到它,swift 4支持异常处理,我想做的是我不希望我的应用程序被撞坏了

这是我想要捕获的代码,当我没有得到价格值

let srt = self.Coin[indexPath.row] as! NSDictionary
var sr2=NSDictionary()
var barr  = NSArray()

if srt.value(forKey: "Price") != nil{
    do{
        barr = try srt.value(forKey: "Price") as! NSArray
        if (barr.count>0) {
            sr2 = barr[0] as! NSDictionary
        }
    } catch {
        print("Price is empty")
    }
}

2 个答案:

答案 0 :(得分:1)

并非所有错误都可以在Swift中捕获。 do-catch块只能处理throwable函数抛出的错误,其声明使用throws关键字标记,并使用throw关键字从这些函数内部显式抛出错误。

Swift中的所有其他错误都是无法捕获的,尤其是因强制解包,强制转换或强制尝试(try!)而导致的运行时错误。当您使用!强制某些内容时,您告诉编译器您知道自己在做什么,并且在发生错误时应该抛出运行时错误。

除非您绝对确定它们不会失败,或者您希望在开发阶段的早期发现编程错误,否则不应使用强制解包/强制转换。不要使用带有嵌套强制语句的无用do-catch块,只需使用可选绑定来安全地转换/解包可选值。

此外,请勿在Swift中使用NSDictionaryNSArray,使用其原生等价物DictionaryArray。您似乎在解析JSON,因此请使用[String:Any]代替NSDictionary[[String:Any]]而不是NSArray

if let srt = self.Coin[indexPath.row] as? [String:Any] {
    if let barrs = srt["Price"] as? [[String:Any]], let barr = barrs.first {
    let sr2 = barr
}

答案 1 :(得分:0)

正如大卫所说,我会避免用力展开和强迫施法。 但我不是使用if let语句,而是使用guard let来避免厄运金字塔,如下所示:

 guard let srt = self.Coin[indexPath.row] as? [String:Any], let barr = srt["Price"] as? [[String:Any]], let sr2 = barr.first as? [String:Any] else {
        print("Price is empty")
        //Need to return, throw or whatever
    }

我们甚至可以删除你的中间变量,但它的可读性要低得多,如下:

 guard let sr2 = ((self.Coin[indexPath.row] as? [String : Any])?["Price"] as? [[String : Any]])?.first as? [String : Any] else {
        print("Price is empty")
        //Need to return, throw or whatever
    }

如果您更愿意使用if let语句(如果您不想返回或引入guard语句的else条款),您也可以使用一个if语句,就像那个

 if let srt = self.Coin[indexPath.row] as? [String:Any], let barr = srt["Price"] as? [[String:Any]], let sr2 = barr.first {
        //Do something with sr2
    }

没有中间变量的较短版本:

if let sr2 = ((self.Coin[indexPath.row] as? [String:Any])?["Price"] as? [[String:Any]])?.first {
        //Do something with sr2
    }

无论你选择什么......不要强行打开包装。不要强迫尝试。不要强迫施法。有一天它会回来咬你。