處理方式
// 方式一:try方式 程序員手動捕捉異常
do {
try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
} catch {
// error異常的對象
print(error)
}
// 方式二:try?方式(常用方式) 系統(tǒng)幫助我們處理異常,如果該方法出現(xiàn)了異常,則該方法返回nil.如果沒有異常,則返回對應(yīng)的對象
guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
return
}
// 方式三:try!方法(不建議,非常危險) 直接告訴系統(tǒng),該方法沒有異常.注意:如果該方法出現(xiàn)了異常,那么程序會報錯(崩潰)
let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
定義異常類型
在 Swift 中,錯誤用符合Error協(xié)議的類型的值來表示霎迫。這個空協(xié)議表明該類型可以用于錯誤處理。
Swift 的枚舉類型尤為適合構(gòu)建一組相關(guān)的錯誤狀態(tài)帘靡,枚舉的關(guān)聯(lián)值還可以提供錯誤狀態(tài)的額外信息知给。
enum ExceptionError: Error {
case ExceptionErrorA //異常錯誤A
case ExceptionErrorB //異常錯誤B
case ExceptionErrorC //異常錯誤C
}
拋出一個錯誤可以讓你表明有意外情況發(fā)生,導(dǎo)致正常的執(zhí)行流程無法繼續(xù)執(zhí)行测柠。拋出錯誤使用throw關(guān)鍵字炼鞠。
定義異常函數(shù)
func canThrowErrors(type: Int) throws -> String? {
//函數(shù)體寫成switch/case更好一些
if type == 1 {
throw ExceptionError.exceptionErrorA
}
if type == 2 {
throw ExceptionError.exceptionErrorB
}
if type == 3 {
throw ExceptionError.exceptionErrorC
}
return "success"
}
異常處理 (方式一)
do {
let data = try canThrowErrors(type: 1)//執(zhí)行這個函數(shù) 這個函數(shù)可能拋出異常
if let d = data {
print(d)
} else {
print("nil")
}
} catch ExceptionError.exceptionErrorA {
print("exceptionErrorA")
} catch ExceptionError.exceptionErrorB {
print("exceptionErrorB")
} catch ExceptionError.exceptionErrorC {
print("exceptionErrorC")
} catch {
print("exceptionErrorMore")
}
異常處理 (方式二)
print("\(String(describing: try? canThrowErrors(type: 1)))")
異常處理 (方式三)
這個把上面的try?改為try!就好
異常處理 defer (指定清理操作)
可以使用defer語句在即將離開當(dāng)前代碼塊時執(zhí)行一系列語句缘滥。該語句讓你能執(zhí)行一些必要的清理工作,不管是以何種方式離開當(dāng)前代碼塊的——無論是由于拋出錯誤而離開谒主,或是由于諸如return朝扼、break的語句。例如霎肯,你可以用defer語句來確保文件描述符得以關(guān)閉擎颖,以及手動分配的內(nèi)存得以釋放。
defer語句將代碼的執(zhí)行延遲到當(dāng)前的作用域退出之前观游。該語句由defer關(guān)鍵字和要被延遲執(zhí)行的語句組成搂捧。延遲執(zhí)行的語句不能包含任何控制轉(zhuǎn)移語句,例如break懂缕、return語句允跑,或是拋出一個錯誤。
- 延遲執(zhí)行的操作會按照它們聲明的順序從后往前執(zhí)行——也就是說搪柑,第一條defer語句中的代碼最后才執(zhí)行聋丝,第二條defer語句中的代碼倒數(shù)第二個執(zhí)行,以此類推工碾。最后一條語句會第一個執(zhí)行
func canThrowErrors(type: Int) throws -> String? {
defer {//拋出異常就執(zhí)行defer 為拋出異常就最后執(zhí)行defer
print("canThrowErrors defer Top")
}
defer {//拋出異常就執(zhí)行defer 為拋出異常就最后執(zhí)行defer
print("canThrowErrors defer Middle")
}
defer {//拋出異常就執(zhí)行defer 為拋出異常就最后執(zhí)行defer
print("canThrowErrors defer Bottom")
}
//函數(shù)體寫成switch/case更好一些
if type == 1 {
throw ExceptionError.exceptionErrorA
}
if type == 2 {
throw ExceptionError.exceptionErrorB
}
if type == 3 {
throw ExceptionError.exceptionErrorC
}
return "success"
}
再執(zhí)行一遍方式一,打印結(jié)果
canThrowErrors defer Bottom
canThrowErrors defer Middle
canThrowErrors defer Top
exceptionErrorA