美文网首页
Swift 错误捕捉及处理⑪

Swift 错误捕捉及处理⑪

作者: Aliv丶Zz | 来源:发表于2020-08-05 17:04 被阅读0次

1. 自定义错误

  • Swift中可以通过Error协议自定义运行时的错误信息
  • 函数内部通过throw抛出自定义Error,可能会抛出Error的函数必须加上throws声明
  • 需要使用try调用可能会抛出Error的函数
enum SomeError : Error {
    case illegalArg(String)
    case outOfBounds(Int, Int)
    case outOfMemory
}

func divide(v1: Int, v2: Int) throws ->  Int {
    if v2 == 0 {
        throw SomeError.illegalArg("0不能作为除数")
    }
   return  v1 / v2
}


2. 处理Error

    1. 可以使用do-catch捕捉Error进行处理,抛出Error后,try下一句知道作用域结束的代码都将停止执行
    1. 不捕捉Error,在当前函数增加throws声明,Error将自动抛给上层函数,如果最顶层函数(main)依然没有捕捉Error,那么程序将终止

方式1

func test(){
    print("1")
    do{
        print("2")
        let res = try divide(v1: 10, v2: 0)
        print("res:",res)

    }catch  let SomeError.illegalArg(msg){
        print("参数异常:",msg)
    }catch  let SomeError.outOfBounds(size, index){
        print("下标越界:","size = \(size)","index = \(index)")
    }catch  let outOfMemory{
        print("内存溢出")
    }catch{
        print("其他错误")
    }
    print("4")
}

【打印结果】:

1
2
参数异常: 0不能作为除数
4

方式2

func test(){
    print("1")
    do{
        print("2")
        let res = try divide(v1: 10, v2: 0)
        print("res:",res)

    }catch let error{
        switch error {
            case let SomeError.illegalArg(msg):
                print("参数异常:",msg)
            default:
                print("11")
        }
    }
    print("4")
}

方式3,4

// 直接抛给上层
func test2() throws {
        let res = try divide(v1: 10, v2: 0)
        print("res:",res)
}
test2()
// 除SomeError错误类型外,其他抛给上层
func test3() throws {
    do{
        print("2")
        let res = try divide(v1: 10, v2: 0)
        print("res:",res)
    }catch is SomeError{
        print("SomeError")

    }
}

3 try? try!

  • 可以使用try?、try!调用可能会抛出Error的函数,这样就不用去处理Error
var result1 = try? divide(v1: 20, v2: 2)//Optional(10) 
var result2 = try? divide(v1: 20, v2: 0)//nil 
var result3 = try! divide(v1: 20, v2: 2)//10
print(result1,result2,result3)//Optional(10) nil 10

4 rethrows

  • rethrow 表明,函数本身不会抛出错误,但调用闭包参数抛出错误,那么他会将错误向上抛
func exec(_ fn:(Int, Int) throws -> Int, _ num1: Int, _ num2: Int) rethrows {
    print(try fn(num1,num2))
}
//Fatal error: Error raised at top level:
try exec(divide, 20, 0)

5 defer

  • defer语句:用来定义以任何方式(抛错误、returen等)离开代码块之前必须要执行的代码
  • defer语句将延迟至当前作用域结束之前执行
func processFile(){
    try divide(v1: 10, v2: 0)
    defer{
        print("defer")//即便divide报错,也会执行defer
    }
}
  • defer 语句的执行顺序与定义顺序相反
func fun1() {
    print("f1")
}
func fun2() {
    print("f2")
}
func testFn(){
    defer { fun1() }
    defer { fun2() }
}
testFn()

【打印结果】:

f2
f1

相关文章

网友评论

      本文标题:Swift 错误捕捉及处理⑪

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