swift从入门到精通15-错误处理

424 阅读2分钟

1.自定义错误

一般使用枚举自定义错误码。

例子:

enum SomeError:Error {
    case A(String)
    case B(Int,Int)
}

2.do -catch

  1. 函数内部可以通过throw抛出异常,可能抛出的函数必须加上throws声明。
  2. 调用函数需要用try调用可能抛出的异常。
  3. 使用do-catch来捕捉错误。
  4. 如果这一层不捕捉,可以在当前函数加上throws声明,让错误抛给上一层函数。
  5. 如果最顶层没有捕捉错误,程序将会结束。

例子:

func chufa(num1: Int,num2: Int) throws ->  Int {
    if num2 == 0 {
        throw SomeError.A("0不能作为除数")
    }
    return num1 / num2
}


do {
    let reslut = try chufa(num1: 20, num2: 0)
    print("result:\(reslut)")
}catch let error {
    switch error {
    case let SomeError.A(msg):
        print(msg)
    default:
        print("其他错误")
    }
    
}

3.try?,try!

我们可以使用try?或者try!来调用可能抛出Error的函数,这样就不用处理Error。

例子:

let ret = try? chufa(num1: 20, num2: 0)
let ret2 = try! chufa(num1: 20, num2: 10)

4.rethrows

函数本身不会抛出错误,但是调用闭包参数抛出错误,则需要声明rethrows,它会把错误往上面抛。

例子:

func exec(_ fn: (Int,Int) throws -> Int,_ num1: Int, _ num2: Int) rethrows {
    print(try fn(num1, num2))
}


try exec(chufa, 20, 10)

5.defer

defer语句,用来定义以任何方式(错误,return)离开代码前必须要执行的代码,在作用域结束前会执行一次。

例子:

func openFile(_ file: String) {
    print(1)
}


func closeFile(_ file: String) {
    print(2)
}


func test(file: String) throws {
    openFile(file)
    defer {
        closeFile(file)
    }
   try chufa(num1: 20, num2: 0)
}


try? test(file: "abc")

6.assert(断句)

很多编程语言都有断言机制,不符合条件就可以抛出运行错误。常用于调试的时候判断。

例子:

func chufa(num1: Int,num2: Int) throws ->  Int {
    assert(num2 != 0, "0不能作为除数,真的")
    return num1 / num2
}

7.fatalError

使用fatalError,可以直接在程序运行时,直接抛出异常,并不能捕捉。

例子:

func test2 () {
    fatalError("就是不能进来")
}


test2()

8.局部作用域

可以使用do来使用局部作用域。

例子:

do {
    print("局部作用域")
}


上一篇文章:swift从入门到精通14-协议

下一篇文章:swift从入门到精通16-泛型