《从零开始学Swift》学习笔记(Day 55)——使用try?和try!区别
原創文章,歡迎轉載。轉載請注明:關東升的博客?
?? 在使用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()函數沒有聲明拋出錯誤,在調用它的時候不需要try關鍵字,錯誤傳播鏈條在printNotes()函數內被打破了。
??? 代碼將try dao.findAll()語句改為try! findAll(),在try后面加了感嘆號(!),這樣編譯器就不會要求printNotes()方法聲明拋出錯誤了,try!打破了錯誤傳播鏈條,但是如果真的發生錯誤就出現運行期錯誤,導致程序的崩潰。
??? 所以使用try!打破錯誤傳播鏈條時,應該確保程序不會發生錯誤。
?
歡迎關注關東升新浪微博@tony_關東升。
關注智捷課堂微信公共平臺,了解最新技術文章、圖書、教程信息
?????????????????????????????
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php
?
?
轉載于:https://blog.51cto.com/tonyguan/1748320
總結
以上是生活随笔為你收集整理的《从零开始学Swift》学习笔记(Day 55)——使用try?和try!区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 肖鹏:微博数据库那些事儿(图灵访谈)
- 下一篇: 感性的记录一次生活