swiftiOS开发 Objective-CiOS开发 Swift

Swift-异常处理四种方式

2018-09-05  本文已影响550人  捕梦少女的梦想

跟其它语言一样,Swift的异常处理是在程序抛出异常后的处理逻辑。 Swift提供了一流的异常抛出、捕获和处理的能力。跟Java语言类似, Swift的异常并不是真正的程序崩溃, 而是程序运行的一个逻辑分支;Swift和Java捕获异常的时序也是一样的。当Swift运行时抛出异常后并没有被处理, 那么程序就会崩溃。

在Swift语言中使用Error表示异常, 作用同Java的Exception类或Object-C的NSError类。

苹果建议使用枚举作为异常类型(为什么不推荐用类或者结构体?答案是枚举数据类型本身就是分成若干种情况,很适合做逻辑分支判断条件)。

1.定义枚举异常值

enum VendingMathineError: Error {
    case invalidSelection
    case insufficientFunds(coinsNeed: Int)
    case outOfStack
}

2.抛出异常(throws)

我们可以在方法中抛出异常,定义抛出异常的方法很简单,只需要在返回值的 -> 前面加上throws就好了。示例如下:

   func canThrowErrors() throws -> String {
        if type == 1 {
            throw VendingMathineError.invalidSelection
        }
        if type == 2 {
            throw VendingMathineError.outOfStack
        }
        if type == 3 {
            throw VendingMathineError.insufficientFunds(coinsNeed: 100)
        }
        return "success"
    }

3.捕获异常(catch)

        do {
            try canThrowAnError()
            // 没有错误消息抛出
        } catch {
            // 有一个错误消息抛出
        }

4.不处理异常(try? & try! )

try?

try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。

// 查询所有数据方法
    func findAll() throws -> [Note] {
        guard listData.count > 0 else {
            // 抛出"没有数据"错误。
            throw DAOError.NoData
        }
        return listData
    }
    let datas  = try? findAll()
    print(datas)

try!

使用try!可以打破错误传播链条。错误抛出后传播给它的调用者,这样就形成了一个传播链条,但有的时候确实不想让错误传播下去,可以使用try!语句。

// 查询所有数据方法
    func findAll() throws -> [Note] {
        guard listData.count > 0 else {
            //抛出"没有数据"错误。
            throw DAOError.NoData
        }
        return listData
    }
    func printNotes() {
        let datas  = try! findAll()
        for note in datas {
            print("date : \(note.date!) - content: \(note.content!)")
        }
    }
    printNotes()
上一篇下一篇

猜你喜欢

热点阅读