1. 程式人生 > >《從零開始學Swift》學習筆記(Day 55)——使用try?和try!差別

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

移動設計 ani ecb pcl mva fde 成了 lms 官方

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

在使用try進行錯誤處理的時候,常常會看到try後面跟有問號(?

)或感嘆號(!),他們有什麽差別呢?

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語句將其包裹起來。

2.使用try!

使用try!能夠打破錯誤傳播鏈條。

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

改動上述代碼例如以下:

//查詢全部數據方法

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()

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

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

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

歡迎關註關東升新浪微博@tony_關東升。


關註智捷課堂微信公共平臺,了解最新技術文章、圖書、教程信息
?技術分享
很多其它精品iOSCocos、移動設計課程請關註智捷課堂官方站點:http://www.zhijieketang.com
智捷課堂論壇站點:http://51work6.com/forum.php

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