錯誤處理(Error Handling)

????你可以使用錯誤處理來響應(yīng)你的程序在執(zhí)行中可能會碰到的符合錯誤條件的錯誤。

? ? 相比于可以用是否存在值來表示函數(shù)執(zhí)行的成敗的可選值,錯誤處理讓你可以確定錯誤的內(nèi)在原因,必要的話,也可以把錯誤傳播給你程序的其他部分。

? ? 當一個函數(shù)發(fā)生了錯誤,它會拋出一個錯誤。方法的調(diào)用者可以捕獲錯誤并且做出合適的回應(yīng):

? ??????func canThrowAnError() throws {

????????? ? // this function may or may not throw an error

????????}

? ? 在定義函數(shù)的時候包含throws關(guān)鍵字可以表明這個函數(shù)可能會拋出錯誤。當你調(diào)用一個可能會拋出錯誤的函數(shù),在表達式只預(yù)先考慮使用 try 關(guān)鍵字。

? ? Swift會自動把錯誤傳播出當前的范圍,直到被catch語句捕獲且處理。

????????do {

????? ? ????try canThrowAnError()

? ? ????????// no error was thrown

????????????} catch {

????? ? ????// an error was thrown

????????}

? ? 一個do語句創(chuàng)建了一個新的局部環(huán)境,這個環(huán)境允許錯誤傳播到一個或者更多的catch語句中。

? ? 下面是一個例子,表明了應(yīng)該怎么使用錯誤處理來響應(yīng)不同的錯誤條件:

? ??????func makeASandwich() throws {

? ????????? // ...

????????}

????????do {

????????????try makeASandwich()

????? ? ????eatASandwich()

????????} catch SandwichError.outOfCleanDishes {

? ? ????????washDishes()

????????} catch SandwichError.missingIngredients(let ingredients) {

????????? ? buyGroceries(ingredients)

????????}

????這個例子中,函數(shù)makeASandwich()在沒有可用的干凈的碗碟或者缺少某一些原料的情況下會拋出錯誤。因為函數(shù)makeASandwich()可以拋出異常,這個函數(shù)在調(diào)用時候包在了try表達式中。把函數(shù)調(diào)用包在do語句中,拋出的錯誤可以被傳播到下面提供的catch語句中。

? ? 如果沒有錯誤拋出,那么函數(shù)eatASandwich()會被調(diào)用,如果有錯誤拋出,且錯誤類型和SandwichError.outOfCleanDishes相匹配,那么函數(shù)washDishes()會被調(diào)用,相同的,如果拋出的錯誤和SandwichError.missingIngredients相匹配,那么函數(shù)buyGroceries會配合catch語句捕獲到的ingredients被調(diào)用。

????關(guān)于拋出錯誤,捕獲錯誤,傳播錯誤,在后面關(guān)于錯誤處理的章節(jié)中會有更加詳細的解釋。

? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容