????你可以使用錯誤處理來響應(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é)中會有更加詳細的解釋。
? ??