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

举报
文如秋雨 发表于 2022/08/30 13:06:09 2022/08/30
【摘要】 在本章中,你将学会ErrorHandling异常处理的使用方法。前言和Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。这同时也是对自己学习Swift语言过程的知识整理。如有错误,以你为准。错误处理的定义错误处理(Error handling),是响应错误以及从错误中恢复的过程。在Swift开发过程中,我...
在本章中,你将学会ErrorHandling异常处理的使用方法。

前言


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

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

如有错误,以你为准。

错误处理的定义


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

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

错误情况的创建


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





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

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

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

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

对于AllError的枚举,我们声明了3中错误情况:error1、error2、error3。

当然,这可以自己按照业务情况设置相应的错误项,比如在字典中,可以使用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。




错误情况的抛出


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

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

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

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


错误情况的处理


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

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。



本章代码


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 ?? "")
    }
}


以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。