美文网首页
Swift Error 处理

Swift Error 处理

作者: leblanc_i | 来源:发表于2021-09-11 18:01 被阅读0次

定义一个方法,获取两个数的除数,针对下面这段代码来进行Error的处理

    func divide(_ num1: Int, _ num2: Int) -> Int {
        num1 / num2
    }

当 num2 为 0 的时候,上面代码会发生运行时错误,导致程序崩溃
为解决这个问题,我们需要在代码中对 num2 == 0 单独做判断,然后抛出异常信息

    struct MyError: Error {
        var msg: String
    }
    
    func divide(_ num1: Int, _ num2: Int) throws -> Int {
        if num2 == 0 {
            throw MyError.init(msg: "除数不能为0")
        }
        return num1 / num2
    }

这样当调用 divide 这个方法的时候需要对有可能捕获到的异常信息进行处理,处理方式如下

1、通过 do-catch 捕捉 Error

        do {
            print(1)
            print(try divide(10, 0))
            print(2)
        } catch let error as MyError {
            print(3)
            print(error.msg)
        } catch {
            print("其它错误")
        }

        // 打印结果
        1
        3
        除数不能为0


do catch 必须对所有可能出现的错误结果进行罗列,不然会报错,所以在上面会有 catch 打印"其他错误", 如果不想对详细错误信息进行处理,也可以直接这样写

        do {
            print(try divide(10, 0))
        } catch {
            print("参数错误")
            // 在catch的作用域中自带一个error,可以直接打印
            print(error)
        }

2、不捕捉Error,在当前函数增加throws声明,Error将自动抛给上层函数,如果最顶层函数(main函数)依然没有捕捉Error,那么程序将终止

    func test() throws {
        print(try divide(10, 0))
    }

3、可以使用 try? try! 调用可能会抛出Error的函数,这样就不用去处理Error

        print(try? divide(10, 1))
        print(try? divide(10, 0))
        print(try! divide(10, 2))
        print(try! divide(10, 0))
        // 打印结果
        Optional(10)
        nil
        5
        崩溃

需要注意一下,使用try?得到的结果是可选类型
使用try!解包可能会导致崩溃,除非你确定除数不是0,否则不要用

4、assert(断言)

断言机制:不符合指定条件就抛出运行时错误,常用于调试(debug)阶段的条件判断

    func divide(_ v1: Int, _ v2: Int) -> Int {
        // 当条件为 false时,打印断言中的抛出的错误信息
        assert(v2 != 0, "除数不能为0")
        return v1 / v2
    }

默认情况下,Swift的断言只会在Debug模式下生效,Release模式下会忽略。可手动强制开启或者关闭,TARGETS---Building Settings---Other Swift Flags

  • -assert-config Release:Debug模式下强制关闭断言
  • -assert-config Debug:Release模式下强制开启断言


    assert@2x.png

5、fatalError

如果遇到严重问题,希望结束程序运行,可以直接使用fatalError函数抛出错误。
注:使用了fatalError函数,就不需要再写return

    func divide(_ v1: Int, _ v2: Int) -> Int {
        if v2 != 0 {
            return v1 / v2
        }
        fatalError("除数不能为0")
    }

6、defer

defer语句:用来定义以任何方式(抛错误、return等)离开代码块前必须要执行的代码,也就是说defer语句将延迟至当前作用域结束之前执行

    func open(_ filename: String) -> Int {
        print("open")
        return 0
    }
    
    func close(_ file: Int) {
        print("close")
    }
    
    func processFile(_ filename: String) throws {
        let file = open(filename)
        defer {
            close(file)
        }
        
        // 程序执行到这里会停止,停止之前会调用 defer 中的 close方法
        print(try divide(20, 0))
        
        // close将会在这里调用
        
    }

相关文章

  • 【Swift 3.1】18 - 错误处理 (Error Hand

    【Swift 3.1】18 - 错误处理 (Error Handling) 自从苹果2014年发布Swift,到现...

  • Error处理,泛型

    swift系列课程 自定义错误 do-catch 处理Error 处理rethrows 处理defer 泛型 关联...

  • Swift Error 处理

    定义一个方法,获取两个数的除数,针对下面这段代码来进行Error的处理 当 num2 为 0 的时候,上面代码会发...

  • swift异常处理(Error)

    swift 是一个类型严格的语言,在很多情况下各种不匹配或者强制解包出错都会导致系统崩溃。所以我们需要进行异常处理...

  • Swift中的异常处理

    异常处理 错误处理(Error handling)是响应错误以及从错误中恢复的过程 在 Swift 中,错误用符合...

  • Swift3学习笔记:异常捕捉(Error Handling)

    异常捕捉(Error Handling) Swift的异常处理是在程序中响应错误和处理错误恢复程序正常运行的过程。...

  • 理解Swift中的关键字throw和rethrows

    Swift中throw和rethrows关键字用于异常处理(Error handling),都是用在函数中,可以简...

  • 关键字throw和rethrows

    Swift中throw和rethrows关键字用于异常处理(Error handling),都是用在函数中,可以简...

  • swift throws异常处理

    Swift中throw和rethrows关键字用于异常处理(Error handling) 对于可能的异常通常可以...

  • Swift (七)

    错误处理 错误处理(Error handling)是响应错误以及从错误中恢复的过程。Swift 在运行时提供了抛出...

网友评论

      本文标题:Swift Error 处理

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