Swift实用小册16:ErrorHandling异常处理的使用

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

在本章中,你将学会ErrorHandling异常处理的使用方法。

前言

Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。

这同时也是对自己学习Swift语言过程的知识整理。

如有错误,以你为准。

错误处理的定义

错误处理(Error handling),是响应错误以及从错误中恢复的过程。

Swift开发过程中,我们常常会遇到由于一些方法无法执行或者参数丢失等原因导致的系统报错问题,严重一点可能会导致系统奔溃。而错误处理(Error handling),正是当这样那样的问题发生时,系统能够检测到错误并告知我们。

错误情况的创建

我们新建一个PlayGround项目,命名为SwiftErrorHandling

1.png

要想使用Swift错误处理的方法,首先我们需要知道有可能存在哪些会引发错误的问题。

对于这些问题,我们通常可以使用枚举的方式构建错误结果的项。示例:

enum AllError: Error {
    case error1
    case error2
    case error3
}
复制代码

上述代码中,我们创建了一个AllError的枚举,它遵循Error协议。Error协议是Swift语法中,我们抛出错误时,错误情况的枚举类型需要遵守自Error协议。

对于AllError的枚举,我们声明了3中错误情况:error1error2error3

当然,这可以自己按照业务情况设置相应的错误项,比如在字典中,可以使用case emptyKey表示字典中key的值为空这种错误情况。

如果我们需要错误情况的结果添加描述信息,用通俗的描述文字告知用户这个错误是什么意思,则需要遵循LocalizedError协议,我们写一个extension拓展来描述信息。示例:

extension AllError: LocalizedError {
    var errorDescription: String? {
        switch self {
        case .error1:
            return "第一个错误"
        case .error2:
            return "第二个错误"
        case .error3:
            return "第三个错误"
        }
    }
}
复制代码

上述代码中,我们拓展了AllError枚举,它遵循LocalizedError协议。

然后我们声明了一个可选String类型的errorDescription变量来作为描述信息,我们根据枚举的不同结果返回输出不同的错误信息文字。

如果是需要不基于枚举的项自定义错误结果,那么我们需要让拓展遵循CustomNSError协议。示例:

extension AllError: CustomNSError{
    var errorCode: Int{
        return 404
    }
}
复制代码

上述代码中,我们拓展了AllError枚举,它遵循CustomNSError协议。

然后我们声明了一个Int类型的变量errorCode,当我们错误发生时,返回404

2.png

错误情况的抛出

上面,我们已经定义好了错误情况的结果,那么在实际业务当中,我们可以对可能存在错误的场景进行判断,并抛出错误信息。示例:

func LoginError(username: String?) throws {
    if username == nil {
        throw AllError.error1
    } else {
        print("username不为空")
    }
}
复制代码

上述代码中,我们定义了一个LoginError的方法,它接收可选String类型的username的值,如果这个值为nil,那么我们就使用throw关键字将Error类型的错误抛出。

我们使用throw关键字时,方法声明中就必须使用throws来接收错误。

3.png

错误情况的处理

上面,我们创建了错误情况的结果和描述,然后也在具体业务中可以抛出即接收错误情况信息,下面,我们对异常情况进行处理。

Swift提供了三种集中处理错误的方法:try、try?、try! 。定义如下:

try:Error将自动抛给上层函数。如果最终没人处理到main函数,系统一样会崩溃闪退。

try?: Error将返回nil,不向上传递。

try!:确定了不会有异常才能使用,不然系统会崩溃闪退。

我们可以使用do-catch捕获异常,示例:

func TryExample() {
    do {
        try LoginError(username: nil)
    } catch {
        let err = error as? CustomNSError
        print(err?.errorCode ?? "")
    }
}
复制代码

上述代码中,我们定一个TryExample方法,我们使用do-catch语句运行一段闭包代码来处理错误。

如果在do子句中的代码抛出了LoginError错误,那么我们会在catch子句进行处理。

我们这里接收的错误是LoginError方法中username为空,处理的结果是打印输出遵循CustomNSError协议的AllError的错误描述结果404

4.png

本章代码

import UIKit

enum AllError: Error {
    case error1
    case error2
    case error3
}

extension AllError: LocalizedError {
    var errorDescription: String? {

        switch self {
        case .error1:
            return "第一个错误"
        case .error2:
            return "第二个错误"
        case .error3:
            return "第三个错误"
        }
    }
}

extension AllError: CustomNSError {
    var errorCode: Int {
        return 404
    }
}

func LoginError(username: String?) throws {
    if username == nil {
        throw AllError.error1
    } else {
        print("username不为空")
    }
}

func TryExample() {
    do {
        try LoginError(username: nil)
    } catch {
        let err = error as? CustomNSError
        print(err?.errorCode ?? "")
    }
}
复制代码

以上就是本章的全部内容。

快来动手试试吧!

如果本专栏对你有帮助,不妨点赞、评论、关注~

猜你喜欢

转载自juejin.im/post/7108343066410352648