美文网首页
iOS Swift 基础之错误处理

iOS Swift 基础之错误处理

作者: 一眼万年的星空 | 来源:发表于2021-11-21 22:02 被阅读0次

    本文要解决的问题:
    ● 错误常用的协议有哪些
    ● 如何抛出错误
    ● 如何捕获错误

    1.错误常用的协议有哪些

      ● 抛出错误时,错误需要遵守自 Error 协议。
      ● 如果需要给错误设置描述信息,则需要遵守LocalizedError协议
      ● 如果需要给错误设置 errorDomain、errorCode、errorUserInfo信息,则需要遵守CustomNSError协议
    
    // 错误的基础协议
    public protocol Error {}
    
    // 有详细的错误信息的协议
    public protocol LocalizedError : Error {
    
        /// A localized message describing what error occurred.
        var errorDescription: String? { get }
    
        /// A localized message describing the reason for the failure.
        var failureReason: String? { get }
    
        /// A localized message describing how one might recover from the failure.
        var recoverySuggestion: String? { get }
    
        /// A localized message providing "help" text if the user requests help.
        var helpAnchor: String? { get }
    }
    
    // 有自定义的错误信息的协议
    public protocol CustomNSError : Error {
    
        /// The domain of the error.
        static var errorDomain: String { get }
    
        /// The error code within the given domain.
        var errorCode: Int { get }
    
        /// The user-info dictionary.
        var errorUserInfo: [String : Any] { get }
    }
    

    2.如何抛出错误

    写个例子来演示如何抛出错误。
    我们先定义一个错误的枚举:

    enum JSONMapError: Error{
        case emptyKey
        case notConformProtocol
    }
    
    extension JSONMapError: LocalizedError{
        var errorDescription: String?{
            switch self {
            case .emptyKey:
                return "emptyKey"
            case .notConformProtocol:
               return "notConformProtocol"
            }
        }
    }
    
    extension JSONMapError: CustomNSError{
        var errorCode: Int{
            return -10001
        }
    }
    

    再写一个需要抛错的情况, 使用 throw 关键字将 Error 类型的错误抛出:

    func test(description: NSString?) {
        
        if description == nil {
            throw JSONMapError.emptyKey
        } else {
            print("desc: \(String(describing: description))")
        }
    }
    

    但是这时,编译器报错了:


    swift-error

    使用了 throw , 方法就必须使用声明成 throws 来接受错误。像下面这样:

    swift-error

    3.如何捕获错误

    现在我们来使用上面的 test() 方法


    swift-error

    编译器建议3中处理方式:
    try
    返回值是一个非可选项,如果发生错误,会向上传播,就需要由当前所在的作用域来处理,有以下处理方式:
    ● 可以选择继续抛出错误
    ● 可以选择使用do-catch 捕获异常
    ● 不处理,有异常则崩溃

    // 1. 继续抛出错误
    func test1() throws {
        try test(description: nil)
    }
    
    // 2. 捕获错误
    func test2() {
        do {
            try test(description: nil)
        } catch {
            let err = error as? CustomNSError
            print(err?.localizedDescription ?? "")  // 遵守了LocalizedError协议
            print(err?.errorCode ?? "")             // 遵守了CustomNSError
        }
        
        // 分情况多次catch
        do {
            try test(description: nil)
        } catch let JSONMapError.emptyKey {
            print("---")
        } catch let JSONMapError.notConformProtocol {
            print("---22")
        }
    }
    
    // 3. 不处理
    let result = try test(description: nil)
    
    swift-error

    try?
    ● 如果有错误,就返回nil;
    ● 没错误则正常执行。
    ● 不向上传播. 不用上一层再进行错误处理

    swift-error

    try!
    ● 确认不会有异常时,可以使用try! .
    ● 不向上传播. 不用上一层再进行错误处理
    ● 不过如果发生了异常,就会崩溃.

    swift-error

    青山不改,绿水长流,后会有期,感谢每一位佳人的支持!

    相关文章

      网友评论

          本文标题:iOS Swift 基础之错误处理

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