Swift throws 處理異常

一、需要在你異常處理的方法上面加上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)

直接報錯
截屏2023-06-28 15.18.31.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容