Swift throws 处理异常

2023-06-27  本文已影响0人  丶天空蓝丶

一、需要在你异常处理的方法上面加上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)
直接报错 截屏2023-06-28 15.18.31.png

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

上一篇 下一篇

猜你喜欢

热点阅读