swift 4是否支持异常处理?

swift 4是否支持异常处理?,swift,exception-handling,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{

我的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")
    }
}

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

Swift中的所有其他错误都是不可修补的,尤其是由强制展开、强制转换或强制尝试(
try!
)引起的运行时错误。当您使用

除非您绝对确定强制展开/强制转换不会失败,或者您希望在开发阶段的早期捕获编程错误,否则不应该使用强制展开/强制转换。与使用无用的
do catch
块和嵌套的强制语句不同,只需使用可选绑定即可安全地强制转换/展开可选值

此外,不要在Swift中使用
NSDictionary
NSArray
,请使用其本机等价物
Dictionary
Array
。似乎您正在解析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
}

正如大卫所说,我会避免强制展开和强制铸造。 但是我宁愿使用
守卫let
来避免厄运金字塔,而不是
if 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
    }

无论你选择什么。。。不要强行展开。不要强求尝试。不要强行施展。总有一天它会回来咬你。

如果让barr=srt.value(forKey:Price)作为?NSArray{…}
可能是一个更安全的选择
swift 4是否支持异常处理
否。但它支持对错误(而不是异常)执行重试捕获。阅读Swift电子书,一切都已解释。相关:另一个选择当然是避免可能的运行时错误,不做强制展开和强制转换,即使这意味着必须额外编写一两行代码。