原創(chuàng)文章短绸,歡迎轉(zhuǎn)載翁脆。轉(zhuǎn)載請注明:關(guān)東升的博客
能放到try后面調(diào)用函數(shù)或方法都是有要求的尚镰,他們是有可能拋出錯誤,在這些函數(shù)或方法聲明的參數(shù)后面要加上throws關(guān)鍵字立倍,表示這個函數(shù)或方法可以拋出錯誤灭红。
聲明拋出錯誤方法示例代碼如下:
//刪除Note記錄方法
func remove(model: Note) throws {
...
}
//查詢所有記錄數(shù)據(jù)方法
func findAll() throws -> [Note] {
...
}
上述代碼remove(_:)方法沒有返回值,throws關(guān)鍵字放到參數(shù)后面口注。findAll()有返回值throws關(guān)鍵字放到參數(shù)和返回值類型之間变擒。
在函數(shù)或方法中拋出錯誤
一個函數(shù)或方法能夠聲明拋出錯誤,是因為在函數(shù)或方法中產(chǎn)生并拋出了錯誤寝志,這樣函數(shù)或方法聲明拋出錯誤才有實際的意義娇斑。
在產(chǎn)生并拋出錯誤方式:
? 在函數(shù)或方法中通過throw語句,人為地拋出錯誤材部。
? 在函數(shù)或方法中調(diào)用的其他可以拋出錯誤函數(shù)或方法毫缆,但是沒有捕獲處理,會導(dǎo)致錯誤被傳播出來乐导。
示例代碼如下:
//刪除Note方法
func remove(model: Note) throws {
guard let date = model.date else { //判斷拋出時候是有了guard語句
//拋出"主鍵為空"錯誤
throw DAOError.PrimaryKeyNull
}
//比較日期主鍵是否相等
for (index, note) in listData.enumerate() where note.date == date {
listData.removeAtIndex(index)
}
}
//查詢所有數(shù)據(jù)方法
func findAll() throws -> [Note] {
guard listData.count > 0 else { //判斷拋出時候是有了guard語句
//拋出"沒有數(shù)據(jù)"錯誤苦丁。
throw DAOError.NoData
}
return listData
}
func printNotes() throws { //聲明拋出錯誤
let datas = try findAll()
for note in datas {
print("date : \(note.date!) - content: \(note.content!)")
}
}
try printNotes()
guard語句最擅長處理這種早期判斷,條件為false情況下拋出錯誤物臂。
findAll()語句本身有可能產(chǎn)生錯誤芬骄,但是并沒有使用catch語句捕獲并處理猾愿,這樣就導(dǎo)致了這個錯誤傳播給該函數(shù)或方法的調(diào)用者,如果它的調(diào)用者也都不捕獲處理账阻,那么最后程序會出現(xiàn)運行期錯誤蒂秘。