17:swift-错误处理

 

 

正文

/* 17:错误处理
 1:处理错误
    当一个错误被抛出,周围的某些代码必须为处理错误响应
    ——比如说,为了纠正错误,尝试替代方案,或者把错误通知用户

 */

import UIKit

class Error17VC: UIViewController {
    
    var a = 0
    func test() {
        a = 0
        // 5: defer:defer中的代码将延迟至当前作用域结束之前执行
        //
        defer {
            a = 1
        }
        a = 2
    }
    
    func test1() {
        print("test1")
    }
    
    func test2() {
        print("test2")
    }
    
    func test3() {
        print("test3")
    }

    //6、多个defer,执行顺序与定义顺序相反  压栈操作,最后执行的位于栈顶,先释放
    func testDefer() {
        defer {
            test1()
        }
        defer {
            test2()
        }
        defer {
            test3()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        self.title = "17:错误处理"
        
        test()
        print("a=\(a)")
        
        //6、多个defer,执行顺序与定义顺序相反
        testDefer()
        
        testOptionalError()
        
        do {
//            let a = try testError(index: 201)
//            let a = try testError(index: 200)
            let a = try testError(index: 199)
//            let a = try testError(index: -1)
            print(a)

        } catch ValueError.ValueErrorOutOfMax {
            print("超出最大界限")
        } catch ValueError.ValueErrorOutOfBounds {
            print("超出界限")
        } catch ValueError.ValueErrorOutOfMin {
            print("超出最小界限")
        } catch {
            print("未知错误")
        }
        
    }
    
    /*2: 抛出错误:错误里没有堆栈信息
        wift 中的错误处理, try, catch  和 throw 的使用与其他语言中的异常处理很相仿。
        不同于许多语言中的异常处理——包括 Objective-C
        ——Swift 中的错误处理并不涉及调用堆栈展开,一个高占用过程。
        因此, throw 语句的性能特征与 return 比不差多少。
     */
    public func testError(index: Int) throws -> Int {
        if index > 200 {
            // 有返回值的时候,不需要return
            throw ValueError.ValueErrorOutOfMax
        } else if index == 200 {
            throw ValueError.ValueErrorOutOfBounds
        } else if index < 0  {
            throw ValueError.ValueErrorOutOfMin
        } else {
            return index
        }
    }
    
    /* 3: 错误可选项
         转换错误为可选项
         使用 try?通过将错误转换为可选项来处理一个错误。如果一个错误在 try?表达式中抛出,则表达式的值为 nil。
         比如说下面的代码x和y拥有同样的值和行为:
     */
    func someThrowingFunction(_ index: Int) throws -> Int {
        if index < 0 {
            throw ValueError.ValueErrorOutOfMin
        }
        return index
    }
    
    // 如果 someThrowingFunction()抛出一个错误, x和 y的值就是 nil。
    func testOptionalError() {
        let x = try? someThrowingFunction(20)
         
        let y: Int?
        do {
            y = try someThrowingFunction(20)
        } catch {
            y = nil
        }
        
        // 4: 取消错误传递 try!
        var a = 10
        if (a > 0) {
            let b = try! someThrowingFunction(a)
            print("取消错误传递:\(b)")
        }
    }
     
    
    // defer:defer中的代码将延迟至当前作用域结束之前执行
    
}


enum ValueError: Error {
    case ValueErrorOutOfBounds
    case ValueErrorOutOfMax
    case ValueErrorOutOfMin
}

 

posted on 2023-03-09 15:33  风zk  阅读(57)  评论(0编辑  收藏  举报

导航