一、需要在你異常處理的方法上面加上throws,下面就拿驗證手機來舉例
func verifyPhoneLegal(_ phone: String) throws -> String {
}
二、創(chuàng)建錯誤信息枚舉
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError //長度不對
case phoneRuleError //規(guī)則不對
}
三、根據(jù)不同的錯誤類型返回不同的錯誤枚舉
func verifyPhoneLegal(_ phone: String) throws -> String {
if phone.isEmpty {
throw PhoneError.phoneEmpty
} else if phone.count != 11 {
throw PhoneError.phoneLengthError
} else if !phone.hasPrefix("1") {
throw PhoneError.phoneRuleError
}
return phone
}
四、使用這個方法,調(diào)用帶有throws的方法必須使用try
try有3種使用方法
1、try? 系統(tǒng)幫助我們處理異常,如果該方法出現(xiàn)了異常,則該方法返回nil.如果沒有異常,則返回對應(yīng)的對象
let phone = try? WSDateUtil().verifyPhoneLegal("")
printLog(phone)
let phone1 = try? WSDateUtil().verifyPhoneLegal("12345678900")
printLog(phone1)
輸出結(jié)果:
2023-06-28 15:14:15.898 LoginViewController.swift[139], buttonClick(sender:): nil
2023-06-28 15:14:15.905 LoginViewController.swift[141], buttonClick(sender:): Optional("12345678900")
2、try! 直接告訴系統(tǒng),該方法沒有異常.注意:如果該方法出現(xiàn)了異常,那么程序會報錯(崩潰)
let phone = try! WSDateUtil().verifyPhoneLegal("")
printLog(phone)
直接報錯
3、do catch 方法,錯誤會走catch
可以通過catch 里面 error 參數(shù)捕捉具體異常類型
do {
let phone = try WSDateUtil().verifyPhoneLegal("")
printLog(phone)
} catch {
switch error {
case PhoneError.phoneEmpty:
printLog("手機號為空")
default:
printLog("其他錯誤")
}
}
do {
let phone = try WSDateUtil().verifyPhoneLegal("12345678900")
printLog(phone)
} catch {
printLog(error)
}
輸出結(jié)果:
2023-06-28 15:25:16.637 LoginViewController.swift[143], buttonClick(sender:): 手機號為空
2023-06-28 15:25:16.644 LoginViewController.swift[150], buttonClick(sender:): 12345678900
第一個走catch,并且判斷出來是手機號為空,第二個正確的直接在do里面返回我們想要的結(jié)果
五、do catch 特殊用法
1、每個catch里面都用switch,代碼太冗余了,可以使用如下方法
do {
let phone = try WSDateUtil().verifyPhoneLegal("")
printLog(phone)
} catch {
(error as! PhoneError).errorStr()
}
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError //長度不對
case phoneRuleError //規(guī)則不對
func errorStr() {
switch self {
case .phoneEmpty:
printLog("電話為空")
case .phoneLengthError:
printLog("長度不對")
case .phoneRuleError:
printLog("規(guī)則不對")
}
}
}
輸出結(jié)果:
2023-06-28 15:43:04.022 WSDateUtil.swift[23], errorStr(): 電話為空
2、throw 返回帶參數(shù)結(jié)果,比喻手機號碼長度不對時返回對應(yīng)的長度
枚舉
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError(Int) //長度不對
case phoneRuleError //規(guī)則不對
}
方法
func verifyPhoneLegal(_ phone: String) throws -> String {
if phone.isEmpty {
throw PhoneError.phoneEmpty
} else if phone.count != 11 {
throw PhoneError.phoneLengthError(phone.count)
} else if !phone.hasPrefix("1") {
throw PhoneError.phoneRuleError
}
return phone
}
調(diào)用
do {
let phone = try WSDateUtil().verifyPhoneLegal("123")
printLog(phone)
} catch {
switch error {
case PhoneError.phoneEmpty:
printLog("手機號為空")
case let PhoneError.phoneLengthError(msg):
printLog("手機號長度為\(msg)")
default:
printLog("其他錯誤")
}
}
輸出結(jié)果:
2023-06-28 16:12:34.615 LoginViewController.swift[145], buttonClick(sender:): 手機號長度為3