Swift异常处理(Error) — do try catch机

2022-03-07  本文已影响0人  雪碧童鞋

Swift提供Error协议来表示当前应用程序发生的错误情况,Error的定义如下:

public protocol Error : Sendable {
}

所以StructClassEnum都可以通过遵守这个协议来表示一个错误,一般情况下偏向于用Enum来表示错误。

1. 定义异常枚举
2.错误的抛出

当需要抛出错误的时候,使用 throw 关键字将 Error 类型的错误抛出,同时使用throw关键字,则方法声明中就必须使用 throws 来接受错误,例如:

func test(name: String?) throws {
    if name == nil {
        throw JSONMapError.emptyKey
    } else {
        print("name不为空")
    }
}
3.捕获错误

Swift中错误的集中处理方式:

// 使用上面的例子演示错误的捕获
func testExample() {
    //示例一
    do {
       try test(name: nil)
    } catch {
        let err = error as? LocalizedError
        print(err?.errorDescription ?? "")
    }
  
    //示例2
  do {
       try test(name: nil)
    } catch JSONMapError.emptyKey {
        print("key为空")
    }catch JSONMapError.notConformProtocol{
        print("没有遵守协议")
    } catch {
        print("unKnown Error")
    }
}

举个字典转模型中常见的错误捕捉例子

protocol CustomJSONMap{
    func jsonMap() throws -> Any
}

extension CustomJSONMap{
    func jsonMap() throws -> Any{
         //Mirror反射,下个章节介绍
        let mirror = Mirror(reflecting: self)
        // 中断递归的条件
        guard !mirror.children.isEmpty else {return self}

        var keyValue: [String: Any] = [:]
        for children in mirror.children{
            if let value = children.value as? CustomJSONMap{
                if let keyName = children.label {
                    keyValue[keyName] = try value.jsonMap() //递归调用
                }else{
                   throw JSONMapError.emptyKey
                }
            }else{
                  throw JSONMapError.notConformProtocol
            }
        }
        return keyValue
    }
}

// 创建HJPerson并遵守CustomJSONMap协议
class HJPerson: CustomJSONMap{
    var age = 18
    var name = "寒冰射手"
    var height  = 1.85
}
// 需要遵守协议才能解析
extension Int: CustomJSONMap{}
extension String: CustomJSONMap{}


var p = HJPerson()
do{
    try p.jsonMap()
}catch {
    print("\(String(describing: (error as? LocalizedError)?.errorDescription))")
}
上一篇 下一篇

猜你喜欢

热点阅读