0
点赞
收藏
分享

微信扫一扫

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

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

前言

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

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

如有错误,以你为准。

错误处理的定义

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

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

错误情况的创建

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

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

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

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

enum AllError: Error {
case error1
case error2
case

上述代码中,我们创建了一个​​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​​。

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

错误情况的抛出

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

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

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

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

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

错误情况的处理

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

​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​​。

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

本章代码

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

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

快来动手试试吧!

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

举报

相关推荐

0 条评论