????你可以使用錯(cuò)誤處理來(lái)響應(yīng)你的程序在執(zhí)行中可能會(huì)碰到的符合錯(cuò)誤條件的錯(cuò)誤。
? ? 相比于可以用是否存在值來(lái)表示函數(shù)執(zhí)行的成敗的可選值稀并,錯(cuò)誤處理讓你可以確定錯(cuò)誤的內(nèi)在原因宠页,必要的話拴泌,也可以把錯(cuò)誤傳播給你程序的其他部分殉农。
? ? 當(dāng)一個(gè)函數(shù)發(fā)生了錯(cuò)誤,它會(huì)拋出一個(gè)錯(cuò)誤蟀淮。方法的調(diào)用者可以捕獲錯(cuò)誤并且做出合適的回應(yīng):
? ??????func canThrowAnError() throws {
????????? ? // this function may or may not throw an error
????????}
? ? 在定義函數(shù)的時(shí)候包含throws關(guān)鍵字可以表明這個(gè)函數(shù)可能會(huì)拋出錯(cuò)誤最住。當(dāng)你調(diào)用一個(gè)可能會(huì)拋出錯(cuò)誤的函數(shù),在表達(dá)式只預(yù)先考慮使用 try 關(guān)鍵字怠惶。
? ? Swift會(huì)自動(dòng)把錯(cuò)誤傳播出當(dāng)前的范圍涨缚,直到被catch語(yǔ)句捕獲且處理。
????????do {
????? ? ????try canThrowAnError()
? ? ????????// no error was thrown
????????????} catch {
????? ? ????// an error was thrown
????????}
? ? 一個(gè)do語(yǔ)句創(chuàng)建了一個(gè)新的局部環(huán)境甚疟,這個(gè)環(huán)境允許錯(cuò)誤傳播到一個(gè)或者更多的catch語(yǔ)句中仗岖。
? ? 下面是一個(gè)例子,表明了應(yīng)該怎么使用錯(cuò)誤處理來(lái)響應(yīng)不同的錯(cuò)誤條件:
? ??????func makeASandwich() throws {
? ????????? // ...
????????}
????????do {
????????????try makeASandwich()
????? ? ????eatASandwich()
????????} catch SandwichError.outOfCleanDishes {
? ? ????????washDishes()
????????} catch SandwichError.missingIngredients(let ingredients) {
????????? ? buyGroceries(ingredients)
????????}
????這個(gè)例子中览妖,函數(shù)makeASandwich()在沒有可用的干凈的碗碟或者缺少某一些原料的情況下會(huì)拋出錯(cuò)誤轧拄。因?yàn)楹瘮?shù)makeASandwich()可以拋出異常,這個(gè)函數(shù)在調(diào)用時(shí)候包在了try表達(dá)式中讽膏。把函數(shù)調(diào)用包在do語(yǔ)句中檩电,拋出的錯(cuò)誤可以被傳播到下面提供的catch語(yǔ)句中。
? ? 如果沒有錯(cuò)誤拋出府树,那么函數(shù)eatASandwich()會(huì)被調(diào)用俐末,如果有錯(cuò)誤拋出,且錯(cuò)誤類型和SandwichError.outOfCleanDishes相匹配奄侠,那么函數(shù)washDishes()會(huì)被調(diào)用卓箫,相同的,如果拋出的錯(cuò)誤和SandwichError.missingIngredients相匹配垄潮,那么函數(shù)buyGroceries會(huì)配合catch語(yǔ)句捕獲到的ingredients被調(diào)用烹卒。
????關(guān)于拋出錯(cuò)誤,捕獲錯(cuò)誤弯洗,傳播錯(cuò)誤旅急,在后面關(guān)于錯(cuò)誤處理的章節(jié)中會(huì)有更加詳細(xì)的解釋。
? ??