iOS Swift 基础之错误处理

2021-11-21  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读