一猎拨、需要在你異常處理的方法上面加上throws脊凰,下面就拿驗(yàn)證手機(jī)來(lái)舉例
func verifyPhoneLegal(_ phone: String) throws -> String {
}
二、創(chuàng)建錯(cuò)誤信息枚舉
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError //長(zhǎng)度不對(duì)
case phoneRuleError //規(guī)則不對(duì)
}
三、根據(jù)不同的錯(cuò)誤類型返回不同的錯(cuò)誤枚舉
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
}
四在跳、使用這個(gè)方法,調(diào)用帶有throws的方法必須使用try
try有3種使用方法
1饮六、try谣沸? 系統(tǒng)幫助我們處理異常,如果該方法出現(xiàn)了異常,則該方法返回nil.如果沒(méi)有異常,則返回對(duì)應(yīng)的對(duì)象
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),該方法沒(méi)有異常.注意:如果該方法出現(xiàn)了異常,那么程序會(huì)報(bào)錯(cuò)(崩潰)
let phone = try! WSDateUtil().verifyPhoneLegal("")
printLog(phone)
直接報(bào)錯(cuò)3、do catch 方法勤篮,錯(cuò)誤會(huì)走catch
可以通過(guò)catch 里面 error 參數(shù)捕捉具體異常類型
do {
let phone = try WSDateUtil().verifyPhoneLegal("")
printLog(phone)
} catch {
switch error {
case PhoneError.phoneEmpty:
printLog("手機(jī)號(hào)為空")
default:
printLog("其他錯(cuò)誤")
}
}
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:): 手機(jī)號(hào)為空
2023-06-28 15:25:16.644 LoginViewController.swift[150], buttonClick(sender:): 12345678900
第一個(gè)走catch都毒,并且判斷出來(lái)是手機(jī)號(hào)為空,第二個(gè)正確的直接在do里面返回我們想要的結(jié)果
五碰缔、do catch 特殊用法
1账劲、每個(gè)catch里面都用switch,代碼太冗余了金抡,可以使用如下方法
do {
let phone = try WSDateUtil().verifyPhoneLegal("")
printLog(phone)
} catch {
(error as! PhoneError).errorStr()
}
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError //長(zhǎng)度不對(duì)
case phoneRuleError //規(guī)則不對(duì)
func errorStr() {
switch self {
case .phoneEmpty:
printLog("電話為空")
case .phoneLengthError:
printLog("長(zhǎng)度不對(duì)")
case .phoneRuleError:
printLog("規(guī)則不對(duì)")
}
}
}
輸出結(jié)果:
2023-06-28 15:43:04.022 WSDateUtil.swift[23], errorStr(): 電話為空
2瀑焦、throw 返回帶參數(shù)結(jié)果,比喻手機(jī)號(hào)碼長(zhǎng)度不對(duì)時(shí)返回對(duì)應(yīng)的長(zhǎng)度
枚舉
enum PhoneError: Error {
case phoneEmpty //電話為空
case phoneLengthError(Int) //長(zhǎng)度不對(duì)
case phoneRuleError //規(guī)則不對(duì)
}
方法
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("手機(jī)號(hào)為空")
case let PhoneError.phoneLengthError(msg):
printLog("手機(jī)號(hào)長(zhǎng)度為\(msg)")
default:
printLog("其他錯(cuò)誤")
}
}
輸出結(jié)果:
2023-06-28 16:12:34.615 LoginViewController.swift[145], buttonClick(sender:): 手機(jī)號(hào)長(zhǎng)度為3