SwiftUI Swift 从入门到精通之控制流 1.5 处理错误 try, throw, do, and catch

1.5 处理错误 try, throw, do, and catch

在编程过程中会发生错误。这些错误可能是由于您自己的代码以意外的方式行为,或者是由于来自外部系统的意外信息或行为。当这些错误发生时,我 要适当地处理它们并不重要。良好的错误处理可以分离出一个好的应用程序和一个伟大的应用程序。

Swift为处理错误提供了一个深思熟虑和灵活的模式,允许特定的错误通过一个复杂的系统进行级联处理。我们将发现如何定义错误,并通过 必要时使用它们。

实战代码

1.首先,让我们将烹饪餐的步骤定义为烹饪将通过::

enum MealState { 
    case initial 
    case buyIngredients 
    case prepareIngredients 
    case cook 
    case plateUp 
    case serve 
}

### 2. 创建一个对象来表示我们将要烹饪的一餐。这个对象将在整个过程中保持食物的状态
class Meal { 
    var state: MealState = .initial 
}

我们希望让食物在状态之间过渡,但不是所有的状态过渡应该都有可能。例如,你不能从买食材转到上餐。这顿饭应该是莫夫 e依次从一个状态切换到下一个状态。我们可以通过只允许从对象本身内部设置状态,使用我们在前面探索的访问控件来提供这些限制。

3.将state 属性定义为只能进行私人设置

class Meal { 
    private(set) var state: MealState = .initial 
}

4. 要允许从对象外部更改状态,请创建一个函数,如果状态转换,将抛出错误

class Meal { 
    private(set) var state: MealState = .initial 
    func change(to newState: MealState) throws { 
        switch (state, newState) { 
        case (.initial, .buyIngredients),   
             (.buyIngredients, .prepareIngredients), 
             (.prepareIngredients, .cook), 
             (.cook, .plateUp),
             (.plateUp, .serve): 
            state = newState
        default: 
            throw MealError.canOnlyMoveToAppropriateState 
        } 
    } 
}

为了与Swift的面向协议的方法保持一致,Swift中的错误被定义为一个协议,错误。该方法允许您构建自己的类型来表示代码中的错误,以及j 请确保它符合错误协议。一种常见的方法是将错误定义为枚举,枚举案例表示可能发生的不同类型的错误。

5. 定义在上一个Meal类中抛出的错误:

enum MealError: Error { 
    case canOnlyMoveToAppropriateState 
}

6. 尝试在一个do块中执行我们的错误抛出方法,并捕获任何可能发生的错误:

let dinner = Meal() 
do {
    try dinner.change(to: .buyIngredients) 
    try dinner.change(to: .prepareIngredients) 
    try dinner.change(to: .cook) 
    try dinner.change(to: .plateUp) 
    try dinner.change(to: .serve) 
    print("Dinner is served!")
    } catch let error { 
        print(error) 
    }

解析

在Swift错误处理(以及其他语言)中使用的隐喻是抛出和捕捉。如果方法在执行过程中出现问题,则会抛出错误,此时没有进一步的i n将执行该方法,并将错误传递回从中调用该方法的地方。


精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复