swift错误处理

2017-10-14  本文已影响47人  Sivan113
1. 自定义错误类型
enum CustomError: Error {
    case oneError
    case twoError
    case threeError
}
2. 主动抛出错误
throw CustomError.oneError
3. 处理抛出的错误

当一个错误被抛出时,必须有相应的代码处理错误响应,swift中有四种方式来处理错误:

    /// 抛出函数
    func canThrowPrinterError(_ inputString: String) throws -> String {
        guard inputString.characters.count > 3 else {
            /// 抛出一个错误,传递给调用者,提前退出程序流
            throw CustomError.lengthError
        }
        guard inputString.contains("123") else {
            /// 抛出一个错误,传递给调用者,提前退出程序流
            throw CustomError.contain123Error
        }
        return "\(inputString) is legal"
    }
    
    /// 1.处理canThrowPrinterError抛出错误的一种方式即传递给nextCanThrowPrinterError(必须也为抛出函数)
    func nextCanThrowPrinterError() throws {
        // canThrowPrinterError会抛出错误,调用前要加上try
        let a = try canThrowPrinterError("dffaf")
        print(a)
    }
    /// 2.使用do-catch处理错误
    func docatchThrowPrinterError() {

        /// (1)有匹配模式
        do {
            try nextCanThrowPrinterError()
            // 如果上面没有抛出错误,那么下面的代码正常走,否则会立马切换到catch语句进行匹配
            // 如果没有项目的匹配项
            print("走到这里说明没有抛出错误")
        } catch CustomError.lengthError {
            print("length less than 3")
        } catch CustomError.contain123Error {
            print("123 is out of string ")
        } catch {
            // 加入一个空的catch,用于关闭catch,否则会报错:Errors thrown from here are not handled because the enclosing catch is not exhaustive
            // 如果以上错误没有匹配完全就会到这里来
            print(error)
        }
        
        /// (2)没有匹配模式
        do {
            try nextCanThrowPrinterError()
        } catch  {
            // 如果一个 catch分句没有模式,这个分句就可以匹配所有错误并且绑定这个错误到本地常量 error上
            print(error) // 打印结果 "contain123Error"
        }
    }
    /// 3.使用try?转为可选项
    func tryThrowPrinterError() {
        // 如果 canThrowPrinterError抛出错误,返回则为nil,相当简洁
        let string = try? canThrowPrinterError("fadfafadf")
        
        // 和下面是等价的
        let str: String?
        do {
            str = try canThrowPrinterError("fadfafadf")
        } catch {
            str = nil
        }
    }
    /// 4.取消错误传递
    func cancelThrowPrinterError() {
        // 确定canThrowPrinterError不会抛出错误,即可这样做,一般来说,不采取这种方式
        let string = try! canThrowPrinterError("12345")
    }
4. defer使用
/// 5.defer使用
    func deferApply(_ inputString: String) throws -> String {
        
        print("first going")
        defer {
            // 该句会在该代码块结束之前调用,不管是throw退出还是return,break,continue的退出
            // 延迟调用
            print("defer is going")
        }
        print("second going") // 打印结果,first going, second going,defer is going
        
        guard inputString.characters.count > 3 else {
            throw CustomError.lengthError
        }
        guard inputString.contains("123") else {
            throw CustomError.contain123Error
        }
        
        return "ffffff"
    }
上一篇下一篇

猜你喜欢

热点阅读