原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:關(guān)東升的博客
在使用try進(jìn)行錯誤處理的時候,經(jīng)常會看到try后面跟有問號(?)或感嘆號(!),他們有什么區(qū)別呢?
1.使用try?
try?會將錯誤轉(zhuǎn)換為可選值,當(dāng)調(diào)用try?+函數(shù)或方法語句時候,如果函數(shù)或方法拋出錯誤,程序不會發(fā)崩潰,而返回一個nil,如果沒有拋出錯誤則返回可選值。
示例代碼如下:
//查詢所有數(shù)據(jù)方法
func findAll() throws -> [Note] {
guard listData.count > 0 else {
//拋出"沒有數(shù)據(jù)"錯誤。
throw DAOError.NoData
}
return listData
}
let datas = try? findAll()
print(datas)
上述代碼中l(wèi)et datas = try? findAll()語句中使用了try?,datas是一個可選值,本例中輸出nil。使用了try?語句沒有必要使用do-catch語句將其包裹起來。
2.使用try!
使用try!可以打破錯誤傳播鏈條。錯誤拋出后傳播給它的調(diào)用者,這樣就形成了一個傳播鏈條,但有的時候確實(shí)不想讓錯誤傳播下去,可以使用try!語句。
修改上述代碼如下:
//查詢所有數(shù)據(jù)方法
func findAll() throws -> [Note] {
guard listData.count > 0 else {
//拋出"沒有數(shù)據(jù)"錯誤。
throw DAOError.NoData
}
return listData
}
func printNotes() {
let datas = try! findAll() ①
for note in datas {
print("date : \(note.date!) - content: \(note.content!)")
}
}
printNotes()
②
代碼printNotes()函數(shù)沒有聲明拋出錯誤,在調(diào)用它的時候不需要try關(guān)鍵字,錯誤傳播鏈條在printNotes()函數(shù)內(nèi)被打破了。
代碼將try dao.findAll()語句改為try! findAll(),在try后面加了感嘆號(!),這樣編譯器就不會要求printNotes()方法聲明拋出錯誤了,try!打破了錯誤傳播鏈條,但是如果真的發(fā)生錯誤就出現(xiàn)運(yùn)行期錯誤,導(dǎo)致程序的崩潰。
所以使用try!打破錯誤傳播鏈條時,應(yīng)該確保程序不會發(fā)生錯誤。