美文网首页
Swift - 异常处理

Swift - 异常处理

作者: MxlZlh | 来源:发表于2021-04-09 15:31 被阅读0次

Swift提供了一流的异常抛出、捕获和处理 能力,跟JAVA语言类似。
Swift的异常并不是真正的程序崩溃, 而是程序运行的一个逻辑分支;Swift和Java捕获异常的时序也是一样的。当Swift运行时抛出异常后并没有被处理, 那么程序就会崩溃。
Swift语言中使用Error表示异常,苹果建议使用枚举作为异常类型(为什么不推荐用类或者结构体?答案是枚举数据类型本身就是分成若干种情况,很适合做逻辑分支判断条件)。

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

上面声明了枚举类型VendingMathineError,继承于Error。 注意Swift的所有异常类型都继承于Error, 就像Java所有异常类都继承于Exception一样。

类似于Java处理异常的try/catch/finally, Swift提供了try、try?、try!、catch、throw、throws关键字处理异常逻辑,用法跟Java也很像。

如何声明一个可能抛出异常的函数? 在函数参数括号后面添加throws关键字, 跟Java语法有点像;区别是Swift的throws后面不用跟着异常类、而Java的throws后面要有异常类名称。 你只要告诉Swift这个函数可能抛出异常就够了,不需要说明到底是哪种异常,函数体内可以抛出任意类型的异常(肯定是继承于Error)。

func canThrowErrors() throws -> String
func canThrowErrors(type: Int) throws -> String? {
    //函数体写成switch/case更好一些
    if type == 1 {
        throw VendingMathineError.invalidSelection
    }
    if type == 2 {
        throw VendingMathineError.outOfStack
    }
    if type == 3 {
        throw VendingMathineError.insufficientFunds(coinsNeed: 100)
    }
    return "success"
}

上面测试代码是为了测试抛异常逻辑, 函数体写成switch/case更好一些。 从canThrowErrors函数看出,当参数为1、2或3时会抛异常, 语法是throw ... 且程序会跳出函数体,语法同Java。

Swift提供了一种类似于Java try/catch的语法, 是do(函数体内必须有try且该语句可能抛出异常)、catch。

do {

    try expression
    statements

} catch pattern 1 {

    statements

} catch pattern 2 where condition {

    statements

}

注意:如果try语句抛出异常则会跳出do代码块,并按顺序逐个catch,当一个catch捕获成功后,后面的catch不再执行。

do {
    var data = try canThrowErrors(type: 3)//执行这个函数 这个函数可能抛出异常

    print("after execute canThrowErrors")
    if data != nil {
        print("Error test data:\(data)")
    }
} catch VendingMathineError.outOfStack {
    print("outOfStack")
} catch VendingMathineError.invalidSelection {
    print("invalidSelection")
} catch {      //类似于Java的catch(Exception ex)
    print("Error")
}
输出:Error

try canThrowsErrors(type: 3)会抛出VendingMathineError.isSufficientFunds(coinsNeed:100),不属于前2个catch类型, 而最后一个catch是捕获所有异常, 所有会执行其函数体。

再介绍一下try?和try!的用法。

let x = try? someThrowingFunction()
//与下面的写法相同
let y: Int? 
do{
  y = try someThrowingFunction()
}catch {
  y = nil
}

try?后面的语句可能会抛出异常, 如果抛出异常则赋值nil给左侧;如果没抛出异常则将返回值赋给左侧;

try!取消异常捕获逻辑,语法有点任性,相当于裸奔, 明知可能抛出异常,但自信这段代码不会抛异常。 try!是try?的补充。你确定后面语句不会抛出异常,但真的抛出异常后程序会崩溃。不建议使用try!,有使用场景推荐使用try?

let tmpX = try? canThrowErrors(type: 1)  //如果抛出异常程序正常运行并赋值nil给左侧, 如果没抛异常则将返回值赋给左侧
//let tmpY = try! canThrowErrors(type: 2)  //你很确定不会抛出异常时这样用,但如果运行时抛异常会导致程序崩溃

Swift使用defer关键字作用同Java的finally, 即使代码块内有break、continue、return或者抛异常,在退出代码块后仍然会执行defer代码块

下面代码只是为了测试,验证函数体内抛出异常时的执行时序, 语法逻辑跟finally一模一样。

func testDefer(_ param: Int) throws -> String {
    print("testDefer begin")
    defer {//抛出异常就执行defer 未抛出异常就最后执行defer
        print("testDefer exit")
    }

    // do something... 
    if param == 1 {
        throw VendingMathineError.invalidSelection
    }

    print("testDefer end")

    return "testDefer return"
    
}
//调用函数 该函数抛出异常 tmpZ = nil
let tmpZ = try? testDefer(1)

输出:
testDefer begin
testDefer exit
//调用函数 该函数未抛出异常 tmpZ = “testDefer return”
let tmpZ = try? testDefer(2)

输出:
testDefer begin
testDefer end
testDefer exit

参考:https://www.cnblogs.com/junhuawang/p/6231084.html

相关文章

  • swift异常处理

    swift像其他编程语言一样可以抛出异常并处理异常,本文就详细说一下在swift中抛出并处理异常,swift中的一...

  • Swift-异常处理四种方式

    跟其它语言一样,Swift的异常处理是在程序抛出异常后的处理逻辑。 Swift提供了一流的异常抛出、捕获和处理的能...

  • SQLite.swift的使用

    知识储备:swift中异常处理 SQLite.swift这个库中有很多的异常处理,详细了解请点击下面的地址: Sw...

  • Swift - 异常处理

    说明 跟其它语言一样,Swift的异常处理是在程序抛出异常后的处理逻辑。 Swift提供了一流的异常抛出、捕获和处...

  • Swift备忘

    Swift初体验 Swift Tips Swift三种不同的【异常处理方式】 Swift 3.0 private变...

  • Swift 处理异常

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

  • swift——异常处理

    FileManager.swift ViewController.swift

  • swift 异常处理

    序言 对异常的正确处理能够明确反映在代码执行中出现的问题,使得在接下来的debug快速定位问题所在的地方,提高de...

  • Swift 异常处理

    异常的由来 在写代码的过程中,我们不能保证自己的每一行代码,都能够正确地执行。不能保证每一个函数,都会返回我们所期...

  • Swift - 异常处理

    Swift提供了一流的异常抛出、捕获和处理 能力,跟JAVA语言类似。Swift的异常并不是真正的程序崩溃, 而是...

网友评论

      本文标题:Swift - 异常处理

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