一、需要在你异常处理的方法上面加上throws,下面就拿验证手机来举例
func verifyPhoneLegal(_ phone: String) throws -> String {
}
二、创建错误信息枚举
enum PhoneError: Error {
case phoneEmpty //电话为空
case phoneLengthError //长度不对
case phoneRuleError //规则不对
}
三、根据不同的错误类型返回不同的错误枚举
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
}
四、使用这个方法,调用带有throws的方法必须使用try
try有3种使用方法
1、try? 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
let phone = try? WSDateUtil().verifyPhoneLegal("")
printLog(phone)
let phone1 = try? WSDateUtil().verifyPhoneLegal("12345678900")
printLog(phone1)
输出结果:
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! 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
let phone = try! WSDateUtil().verifyPhoneLegal("")
printLog(phone)
直接报错3、do catch 方法,错误会走catch
可以通过catch 里面 error 参数捕捉具体异常类型
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)
}
输出结果:
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里面返回我们想要的结果
五、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 //规则不对
func errorStr() {
switch self {
case .phoneEmpty:
printLog("电话为空")
case .phoneLengthError:
printLog("长度不对")
case .phoneRuleError:
printLog("规则不对")
}
}
}
输出结果:
2023-06-28 15:43:04.022 WSDateUtil.swift[23], errorStr(): 电话为空
2、throw 返回带参数结果,比喻手机号码长度不对时返回对应的长度
枚举
enum PhoneError: Error {
case phoneEmpty //电话为空
case phoneLengthError(Int) //长度不对
case phoneRuleError //规则不对
}
方法
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
}
调用
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("其他错误")
}
}
输出结果:
2023-06-28 16:12:34.615 LoginViewController.swift[145], buttonClick(sender:): 手机号长度为3