在本章中,你将学会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 ?? "") } }
以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~