一、異常的抛出與傳遞
代碼的運作很多時候并不會完全按照程式員的設想進行,編寫代碼時進行可控的異常處理機制是十分必要的。通常,對于一個特定的操作,程式員可以定義一個繼承自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