天天看點

Swift專題講解十八——異常處理

一、異常的抛出與傳遞

代碼的運作很多時候并不會完全按照程式員的設想進行,編寫代碼時進行可控的異常處理機制是十分必要的。通常,對于一個特定的操作,程式員可以定義一個繼承自ErrorType的枚舉來進行異常類型的描述,使用throw關鍵字來進行異常的抛出,示例代碼如下:
           

//定義一個自定義的錯誤類型

enum MyError:ErrorType {

case DesTroyError
case NormalError
case SimpleError           

}

//進行異常的抛出

throw MyError.NormalError

函數可以進行錯誤的傳遞,需要使用throws關鍵字來聲明這個函數可能會抛出錯誤,如果不如此聲明,則函數内部抛出的錯誤隻能在函數内部解決,throws關鍵字标記的函數内部抛出的錯誤會被傳遞到調用函數的地方,開發者可以在調用函數的地方捕獲到錯誤描述來做相應處理,示例如下:

func MyFunc()throws -> Void {

throw MyError.NormalError           

對于可能抛出異常的函數調用,開發者要麼在調用函數的地方捕獲處理這些異常,要麼使用try關鍵字将異常繼續抛出去,等待下一層捕獲者處理。異常的處理後面會介紹,繼續抛出異常示例如下:

try MyFunc()

二、異常的處理

除了将錯誤繼續向上抛出之外,Swift還提供了3種處理異常的方式。
           

1.使用do-catch語句來捕獲異常

開發者可以使用do-catch語句來捕獲異常,通過異常類型的判斷來分别做處理,示例代碼如下:

           

do{

try MyFunc()

}catch MyError.DesTroyError{//将列印error1

print("error1")           

}catch MyError.NormalError{

print("error2")           

}catch MyError.SimpleError{

print("error3")           

}catch{//如果上面所有的catch都沒有捕獲 會走這個異常捕獲判斷

print("all")           

2.将異常映射為Optional值

處理異常抛出的第2中方式是使用try?将異常映射為Optional值,可以簡單了解為,對一個可能抛出異常的函數的調用,如果有異常抛出,則傳回值為nil,如果沒有,則函數順利執行,傳回值為其原傳回值,示例如下:
           

//将傳回nil

try? MyFunc()

注意:傳回值為Void并非為nil,結合if-let語句可以編寫十分飄逸的代碼,示例如下:

if let _=try?MyFunc() {

print("success")           

}else{

print("fail")           

3.終止異常傳遞

有時候開發者可以保證一個可能抛出異常的函數絕對不會抛出異常,這時開發者可以使用try!的方式來終止異常的傳遞,但是這樣做有一定風險,如果這個函數真的抛出了異常,則會産生運作時錯誤。示例如下:
           

try! MyFunc()

三、延時執行語句

對于某些釋放資源類的操作,開發者總是希望其離開目前代碼塊時被執行,然後一個複雜流程結構可能會因異常抛出,return,break這些方式被終止,是以,Swift中提供了defer語句來進行延時執行一些操作,defer中的語句總是會在目前代碼塊将要結束時才執行,無論它是以哪種方式結束的,示例如下:
           

//執行此函數将列印

/*

Care

finish

*/

defer{
    print("finish")
}
print("Care")
throw MyError.DesTroyError
           

繼續閱讀