zoukankan      html  css  js  c++  java
  • Swift4.0复习错误处理

    1.Swift中错误的表示:

    “在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可。我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观地表达当前错误类型的每种错误细节。”

    摘录来自: “大话Swift 4.0”。 iBooks.

    /// 定义一个枚举类型的错误类型
    enum MyEnumError: Error {
        case errorOne
        case errorTwo
         
        /// 实现Error协议的localizedDescription只读实例属性
        var localizedDescription: String {
            let desc = self == .errorOne ? "the first errror" : "the second error"
            return "(self): (desc)"
        }
    }
     
    /// 定义一个结构体类型的错误类型
    struct MyStructError: Error {
        var errCode: Int = 0
         
        /// 实现Error协议的localizedDescription只读实例属性
        var localizedDescription: String {
            return "The error code is: (errCode)"
        }
    }
     
    print("The enum error is: (MyEnumError.errorOne.localizedDescription)")
     
    print("The struct error is: (MyStructError().localizedDescription)")

    2.Swift中的错误抛出:

    “在一个函数或方法中可能要抛出一个错误,
    那么我们必须在该函数的形参列表后面,
    返回类型前面(即 -> 之前)添加 throws 关键字,以显式告诉编译器,
    当前函数可能会抛出错误。”
    
    摘录来自: “大话Swift 4.0”。 iBooks. 
    /// 因此这里用throws限定。
    /// 注意throws的位置
    func foo(a: Int) throws -> Int {
        if a < -10 {
            // 如果a的值小于-10,
            // 则抛出MyEnumError.errorOne
            throw MyEnumError.errorOne
        }
        else if a > 10 {
            // 如果a的值大于10,
            // 则抛出MyEnumError.errorTwo
            throw MyEnumError.errorTwo
        }
        else if a == 0 {
            // 如果a的值为0,
            // 那么抛出MyStructError对象,
            // 并且其errCode的值为-1
            throw MyStructError(errCode: -1)
        }
         
        print("a = (a)")
         
        return a
    }
     

    3.错误捕获与处理:

    “在Swift编程语言中我们使用 do-catch 块对错误进行捕获。”

    摘录来自: “大话Swift 4.0”。 iBooks.

    // 由于在以下语句中包含了对可抛出错误的函数调用,
    // 因此这里使用do语句块将这些调用围起来
    do {
        // 对于任一可能会抛出错误的函数,
        // 在调用前面都必须添加try关键字
        var value = try foo(a: -100)
        value += try foo(a: 100)
        value += try foo(a: 0)
         
        print("value = (value)")
    }   // 下面紧接着使用catch语句块
    catch let err {
        // 如果在do语句块中有任一错误抛出,
        // 那么即会执行此catch语句块中的内容
        print("err is: (err)")
    }
     
    // 无论上面do语句块是否有错误,
    // 这句打印均会执行
    print("complete")

    4.rethrows修饰的函数和方法:

    5.将错误转换为可选值:

    6.指定清理行为:

    defer语句块

    func test() {
         
        // 编写第一个defer语句块
        defer {
            print("First defer!")
        }
         
        print("First stage!")
         
        // 编写第二个defer语句块
        defer {
            print("Second defer!")
        }
         
        print("Second stage!")
         
        // 编写最后一个defer语句块
        defer {
            print("Last defer!")
        }
         
        print("Last stage!")
    }
     
    // 这里函数调用执行之后输出:
    // First stage!
    // Second stage!
    // Last stage!
    // Last defer!
    // Second defer!
    // First defer!
    test()

    7.Never修饰的函数:

    “当一个函数在执行后不会返回时,我们用 Never 作为该函数的返回类型,表示该函数不能返回。”

    摘录来自: “大话Swift 4.0”。 iBooks.

    “如果我们程序因为某些状态而导致只能做崩溃或退出处理,那么我们可以调用一个不能返回的函数来抛出错误或直接退出。还有就是当前函数执行一个不断接收消息并分发消息的无限循环,该函数将永不退出”。

    摘录来自: “大话Swift 4.0”。 iBooks.

  • 相关阅读:
    一位区域销售经理百条经验手记
    PAIP.FLEX与JAVA数据对应关系.txt
    转:java生成EXCEL表格(POI vs JXL)
    逆向分析工具介绍
    applet与SERLET交互...
    AT命令集(
    关于WINDOWS超级终端的使用来调试MODEM,串口.
    poj1331
    poj1338
    poj1325
  • 原文地址:https://www.cnblogs.com/pengsi/p/8514591.html
Copyright © 2011-2022 走看看