《從零開始學Swift》學習筆記(Day 55)——使用try?和try!區別

原創文章,歡迎轉載。轉載請註明:關東昇的博客  php

在使用try進行錯誤處理的時候,常常會看到try後面跟有問號(?)或感嘆號(!),他們有什麼區別呢?java

1.使用try? 微信

try?會將錯誤轉換爲可選值,當調用try?+函數或方法語句時候,若是函數或方法拋出錯誤,程序不會發崩潰,而返回一個nil,若是沒有拋出錯誤則返回可選值。函數

示例代碼以下:網站

//查詢全部數據方法
func findAll() throws -> [Note] {
    
    guard listData.count > 0 else {
        //拋出"沒有數據"錯誤。
        throw DAOError.NoData
    }
    return listData
}
 
let datas  = try? findAll()  
 
print(datas)

上述代碼中let datas = try? findAll()語句中使用了try?datas是一個可選值,本例中輸出nil。使用了try?語句沒有必要使用do-catch語句將其包裹起來。spa

 

2.使用try!.net

使用try!能夠打破錯誤傳播鏈條。錯誤拋出後傳播給它的調用者,這樣就造成了一個傳播鏈條,但有的時候確實不想讓錯誤傳播下去,能夠使用try!語句。設計

修改上述代碼以下:code

//查詢全部數據方法
func findAll() throws -> [Note] {
    
    guard listData.count > 0 else {
        //拋出"沒有數據"錯誤。
        throw DAOError.NoData
    }
    return listData
}
 
func printNotes() {
    
    let datas  = try! findAll()       ①
    for note in datas {
        print("date : \(note.date!) - content: \(note.content!)")
    }
}
printNotes()

                       教程

代碼printNotes()函數沒有聲明拋出錯誤,在調用它的時候不須要try關鍵字,錯誤傳播鏈條在printNotes()函數內被打破了。

代碼將try dao.findAll()語句改成try! findAll(),在try後面加了感嘆號(!),這樣編譯器就不會要求printNotes()方法聲明拋出錯誤了,try!打破了錯誤傳播鏈條,可是若是真的發生錯誤就出現運行期錯誤,致使程序的崩潰。

因此使用try!打破錯誤傳播鏈條時,應該確保程序不會發生錯誤。

 

歡迎關注關東昇新浪微博@tony_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
                                                 
 
更多精品iOSCocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php

相關文章
相關標籤/搜索