Swift 处理异常

处理方式

//  方式一:try方式 程序员手动捕捉异常
do {
    try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
} catch {
    // error异常的对象
    print(error)
}

//  方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
    return
}

//  方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

定义异常类型

在 Swift 中,错误用符合Error协议的类型的值来表示。这个空协议表明该类型可以用于错误处理。

Swift 的枚举类型尤为适合构建一组相关的错误状态,枚举的关联值还可以提供错误状态的额外信息。

enum ExceptionError: Error {
    case ExceptionErrorA        //异常错误A
    case ExceptionErrorB        //异常错误B
    case ExceptionErrorC        //异常错误C
}

抛出一个错误可以让你表明有意外情况发生,导致正常的执行流程无法继续执行。抛出错误使用throw关键字。

定义异常函数

func canThrowErrors(type: Int) throws -> String? {
    //函数体写成switch/case更好一些
    if type == 1 {
        throw ExceptionError.exceptionErrorA
    }
    if type == 2 {
        throw ExceptionError.exceptionErrorB
    }
    if type == 3 {
        throw ExceptionError.exceptionErrorC
    }
    return "success"
}

异常处理 (方式一)

do {
    let data = try canThrowErrors(type: 1)//执行这个函数 这个函数可能抛出异常
    if let d = data {
        print(d)
    } else {
        print("nil")
    }
} catch ExceptionError.exceptionErrorA {
    print("exceptionErrorA")
} catch ExceptionError.exceptionErrorB {
    print("exceptionErrorB")
} catch ExceptionError.exceptionErrorC {
    print("exceptionErrorC")
} catch {
    print("exceptionErrorMore")
}

异常处理 (方式二)

print("\(String(describing: try? canThrowErrors(type: 1)))")

异常处理 (方式三)

 这个把上面的try?改为try!就好

异常处理 defer (指定清理操作)

可以使用defer语句在即将离开当前代码块时执行一系列语句。该语句让你能执行一些必要的清理工作,不管是以何种方式离开当前代码块的——无论是由于抛出错误而离开,或是由于诸如return、break的语句。例如,你可以用defer语句来确保文件描述符得以关闭,以及手动分配的内存得以释放。

defer语句将代码的执行延迟到当前的作用域退出之前。该语句由defer关键字和要被延迟执行的语句组成。延迟执行的语句不能包含任何控制转移语句,例如break、return语句,或是抛出一个错误。

  • 延迟执行的操作会按照它们声明的顺序从后往前执行——也就是说,第一条defer语句中的代码最后才执行,第二条defer语句中的代码倒数第二个执行,以此类推。最后一条语句会第一个执行
func canThrowErrors(type: Int) throws -> String? {
    defer {//抛出异常就执行defer 为抛出异常就最后执行defer
        print("canThrowErrors defer Top")
    }
        
    defer {//抛出异常就执行defer 为抛出异常就最后执行defer
        print("canThrowErrors defer Middle")
    }
        
    defer {//抛出异常就执行defer 为抛出异常就最后执行defer
        print("canThrowErrors defer Bottom")
    }
        
    //函数体写成switch/case更好一些
    if type == 1 {
        throw ExceptionError.exceptionErrorA
    }
    if type == 2 {
        throw ExceptionError.exceptionErrorB
    }
    if type == 3 {
        throw ExceptionError.exceptionErrorC
    }
    return "success"
}

再执行一遍方式一,打印结果

canThrowErrors defer Bottom
canThrowErrors defer Middle
canThrowErrors defer Top
exceptionErrorA

你可能感兴趣的:(Swift 处理异常)