能放到try後面調用函數或方法都是有要求的,他們是有可能拋出錯誤,在這些函數或方法聲明的參數後面要加上throws關鍵字,表示這個函數或方法可以拋出錯誤。
聲明拋出錯誤方法示例代碼如下:
//刪除Note記錄方法
func remove(model: Note)throws {
...
}
//查詢所有記錄數據方法
func findAll() throws-> [Note] {
...
}
上述代碼remove(_:)方法沒有返回值,throws關鍵字放到參數後面。findAll()有返回值throws關鍵字放到參數和返回值類型之間。
在函數或方法中拋出錯誤
一個函數或方法能夠聲明拋出錯誤,是因為在函數或方法中產生並拋出了錯誤,這樣函數或方法聲明拋出錯誤才有實際的意義。
在產生並拋出錯誤方式:
在函數或方法中通過throw語句,人為地拋出錯誤。
在函數或方法中調用的其他可以拋出錯誤函數或方法,但是沒有捕獲處理,會導致錯誤被傳播出來。
示例代碼如下:
//刪除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)
}
}
//查詢所有數據方法
func findAll() throws-> [Note] {
guard listData.count > 0 else { //判斷拋出時候是有了guard語句
//拋出"沒有數據"錯誤。
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()語句本身有可能產生錯誤,但是並沒有使用catch語句捕獲並處理,這樣就導致了這個錯誤傳播給該函數或方法的調用者,如果它的調用者也都不捕獲處理,那麼最後程序會出現運行期錯誤。