在開(kāi)發(fā)過(guò)程中,我們可能會(huì)在某些情況下自定義拋出異常羡亩,讓用戶或者開(kāi)發(fā)者捕捉到提示摩疑,便于我們的開(kāi)發(fā)及維護(hù)
如何自定義異常呢?
首先我們需要自定義一個(gè)ErrorInfo機(jī)構(gòu)體畏铆,繼承于Error雷袋,并在結(jié)構(gòu)體中加入我們想拋出的異常信息
/// ErrorInfo
public struct ErrorInfo: Error {
/// agentStatus
public var agentStatus:String = ""
/// errorCode
public var errorCode: String = ""
/// statusCode
public var statusCode : String = "" /// errorMessage
public var errorMessage : String = ""
/// localizedDescription
public var localizedDescription: String {
return "The error code is: \(errorCode),status is \(statusCode),\(errorMessage)"
}
}
然后我們可以進(jìn)行實(shí)例化異常對(duì)象,將自定義的異常信息拋出
public static let error101001:ErrorInfo = ErrorInfo(agentStatus:"101",errorCode:"error101001",statusCode: "DEFAULT",errorMessage: "拋出異常101001")
public static let error102002:ErrorInfo = ErrorInfo(agentStatus:"102",errorCode:"error102002",statusCode: "DEFAULT",errorMessage: "拋出異常102002")
異常的拋出:
swift的異常是可以傳遞的辞居,在不需要進(jìn)行異常處理的方法中楷怒,我們只需將異常進(jìn)行拋出即可蛋勺,直至處理異常的方法,在拋出異常的方法聲明時(shí)鸠删,我們需加入throws關(guān)鍵詞
// 在firstFunc方法中拋出異常抱完,方法聲明中加入throws,ErrorType為我們定義的一個(gè)類冶共,來(lái)管理所有的error
func firstFunc(a:Int) throws -> () {
if a = 1 {
throw ErrorType.error101001
}
}
// secondFunc我們將異常繼續(xù)拋出不進(jìn)行處理乾蛤,方法聲明中加入throws,在firstFunc前加入try
func secondFunc(b:Int) throws -> String? () {
c = b + 1
try firstFunc(c)
return "\(c)"
}
// 方法thirdFunc中捅僵,我們進(jìn)行異常的處理家卖,這時(shí)方法聲明中不需要加throws了,在有異常拋出的方法外庙楚,需進(jìn)行do-catch上荡,在catch中,可以捕捉到ErrorInfo馒闷,并進(jìn)行處理
func thirdFunc(c:Int) -> () {
do {
try secondFunc(c)
} catch {
print(error)
let errorInfo = error as! ErrorInfo
let errorMsg:String = "agentStatus = \(errorInfo.agentStatus)\n" + "errorCode = \(errorInfo.errorCode)\n" + "status = \(errorInfo.statusCode)\n" + "message = " + errorInfo.errorMessage
print(errorMsg)
}
}
理解:
可以這么理解酪捡。
異常就是一個(gè)炸彈,在某種情況下纳账,first會(huì)生產(chǎn)出炸彈逛薇,但是他不處理,通過(guò)聲明方法的時(shí)候的throws關(guān)鍵字疏虫,來(lái)對(duì)外表達(dá)永罚,我這里會(huì)生成炸彈哦,然后second因?yàn)橐猜暶髁藅hrows卧秘,所以他可以繼續(xù)不處理(當(dāng)然也可以處理)呢袱,使用try調(diào)用first,如果first拋出了炸彈翅敌,他就可以繼續(xù)拋下去羞福,而third沒(méi)有聲明throws,所以蚯涮,在third方法中治专,就必須用do-catch把炸彈解決掉了
throws:關(guān)鍵詞的作用,就是告訴外面遭顶,我這里可能會(huì)拋出異常看靠,沒(méi)有throws,就必須把方法內(nèi)的異常用do-catch處理掉
try:相當(dāng)于一個(gè)異常處理工具(不同作用見(jiàn)下面“try/try!/try?區(qū)別”)液肌,可以傳遞或者簡(jiǎn)單處理掉異常
do-catch:相當(dāng)于一個(gè)安全拆彈器,如果方法中拋出異常鸥滨,我們就在catch中將異常安全的處理掉嗦哆。
try/try!/try?區(qū)別
try : 拋出異常并可傳遞或處理
(轉(zhuǎn)鍋神器谤祖,和throws配合使用效果極佳)
try? : 異常不傳遞,一般用在有返回值時(shí)的處理老速,方法成功則返回成功后的值粥喜,失敗則返回nil,類似于解包時(shí)??給默認(rèn)值
(簡(jiǎn)易拆彈器橘券,比較適合有返回值的方法额湘,沒(méi)異常返回正確值,有異常我把炸彈處理了旁舰,給你個(gè)nil)
try! : 異常不傳遞锋华,失敗則閃退,類似強(qiáng)制解包遇到nil的閃退
(自曝型拆彈器箭窜,沒(méi)問(wèn)題你好我好大家好毯焕,有問(wèn)題,app直接閃退磺樱,大家一起死)