美文网首页
swift错误处理

swift错误处理

作者: Sivan113 | 来源:发表于2017-10-14 18:15 被阅读47次
    1. 自定义错误类型
    enum CustomError: Error {
        case oneError
        case twoError
        case threeError
    }
    
    2. 主动抛出错误
    throw CustomError.oneError
    
    3. 处理抛出的错误

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

    • 1、使用throws抛出函数将函数的错误传递给调用者
      形参后加上 throws 关键字,即构成抛出函数,只有抛出函数才可以传递错误,任何在非抛出函数中抛出的错误都必须在该函数内部处理
        /// 抛出函数
        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处理错误
        /// 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?把错误转为可选项
        /// 3.使用try?转为可选项
        func tryThrowPrinterError() {
            // 如果 canThrowPrinterError抛出错误,返回则为nil,相当简洁
            let string = try? canThrowPrinterError("fadfafadf")
            
            // 和下面是等价的
            let str: String?
            do {
                str = try canThrowPrinterError("fadfafadf")
            } catch {
                str = nil
            }
        }
    
    • 4、 使用try!取消错误传递,即明确错误不会发生
        /// 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"
        }
    

    相关文章

      网友评论

          本文标题:swift错误处理

          本文链接:https://www.haomeiwen.com/subject/esgxuxtx.html