1. 自定义错误类型
enum CustomError: Error {
case oneError
case twoError
case threeError
}
2. 主动抛出错误
throw CustomError.oneError
3. 处理抛出的错误
当一个错误被抛出时,必须有相应的代码处理错误响应,swift中有四种方式来处理错误:
-
1、使用throws抛出函数将函数的错误传递给调用者
形参后加上 throws 关键字,即构成抛出函数,只有抛出函数才可以传递错误,任何在非抛出函数中抛出的错误都必须在该函数内部处理
/// 抛出函数
func canThrowPrinterError(_ inputString: String) throws -> String {
guard inputString.characters.count > 3 else {
/// 抛出一个错误,传递给调用者,提前退出程序流
throw CustomError.lengthError
}
guard inputString.contains("123") else {
/// 抛出一个错误,传递给调用者,提前退出程序流
throw CustomError.contain123Error
}
return "\(inputString) is legal"
}
/// 1.处理canThrowPrinterError抛出错误的一种方式即传递给nextCanThrowPrinterError(必须也为抛出函数)
func nextCanThrowPrinterError() throws {
// canThrowPrinterError会抛出错误,调用前要加上try
let a = try canThrowPrinterError("dffaf")
print(a)
}
- 2、 使用do-catch处理错误
/// 2.使用do-catch处理错误
func docatchThrowPrinterError() {
/// (1)有匹配模式
do {
try nextCanThrowPrinterError()
// 如果上面没有抛出错误,那么下面的代码正常走,否则会立马切换到catch语句进行匹配
// 如果没有项目的匹配项
print("走到这里说明没有抛出错误")
} catch CustomError.lengthError {
print("length less than 3")
} catch CustomError.contain123Error {
print("123 is out of string ")
} catch {
// 加入一个空的catch,用于关闭catch,否则会报错:Errors thrown from here are not handled because the enclosing catch is not exhaustive
// 如果以上错误没有匹配完全就会到这里来
print(error)
}
/// (2)没有匹配模式
do {
try nextCanThrowPrinterError()
} catch {
// 如果一个 catch分句没有模式,这个分句就可以匹配所有错误并且绑定这个错误到本地常量 error上
print(error) // 打印结果 "contain123Error"
}
}
- 3、使用try?把错误转为可选项
/// 3.使用try?转为可选项
func tryThrowPrinterError() {
// 如果 canThrowPrinterError抛出错误,返回则为nil,相当简洁
let string = try? canThrowPrinterError("fadfafadf")
// 和下面是等价的
let str: String?
do {
str = try canThrowPrinterError("fadfafadf")
} catch {
str = nil
}
}
- 4、 使用try!取消错误传递,即明确错误不会发生
/// 4.取消错误传递
func cancelThrowPrinterError() {
// 确定canThrowPrinterError不会抛出错误,即可这样做,一般来说,不采取这种方式
let string = try! canThrowPrinterError("12345")
}
4. defer使用
/// 5.defer使用
func deferApply(_ inputString: String) throws -> String {
print("first going")
defer {
// 该句会在该代码块结束之前调用,不管是throw退出还是return,break,continue的退出
// 延迟调用
print("defer is going")
}
print("second going") // 打印结果,first going, second going,defer is going
guard inputString.characters.count > 3 else {
throw CustomError.lengthError
}
guard inputString.contains("123") else {
throw CustomError.contain123Error
}
return "ffffff"
}