主动退出程序的几种情况
- Fatal Errors(致命的错误)
- 使用fatalError()函数可以立即终止你的应用程序,在fatalError()中可以给出终止信息。使用fatalError()函数,会毫无条件的终止你的应用程序,用起来也是比较简单的,就是一个函数的调用。
fatalError("致命错误,调用我程序终止")
- Assertions(断言)
- 在断言中的提示条件是可选的。断言会在Debug模式下起作用,但是在Release版本中就会被忽略。
// @param: condition, 为true时,断言不执行,相应的断言信息不打印。为false时,断言执行,并且打印相应的断言信息。
assert(<#T##condition: Bool##Bool#>, <#T##message: String##String#>)
- 先决条件(Preconditions)
- Preconditions的用法和断言一样,不过有一点需要主要,Preconditions在debug和release模式下都会被执行,除非使用–Ounchecked进行编译。
precondition(<#T##condition: Bool##Bool#>, <#T##message: String##String#>)
Swift中的错误处理
- 在Swift中,如果你要定义你自己的错误类型,你只需要实现ErrorType协议即可。声明完错误类型后,就可以在处理错误抛出异常时使用自定义的错误类型了。
1.使用枚举创建错误类型
- 1.1遵循ErrorType协议,自定义错误类型。下方定义了一个错误类型枚举,该枚举遵循了ErrorType协议,在接下来的代码中我们将会使用这个MyCustomErrorType枚举
enum MyErrorType: ErrorType {
case ErrorReason1
case ErrorReason2
case ErrorReason3
}
- 1.2在我们的函数定义时可以使用throws关键字,以及在函数中使用
throw关键字对错误进行抛出,抛出的错误类型就可以使用上面我们自己定义的错误类型。
func throwError() throws {
let test: Int? = nil
guard test != nil else {
throw MyErrorType.ErrorReason2
}
}
- 1.3上面函数的功能是对错误进行抛出,接下来就该使用
do-catch来处理抛出的错误。使用try对错误进行捕捉,使用do-catch对错误进行处理。
do {
try throwError()
} catch MyErrorType.ErrorReason1 {
print("错误原因: 1")
}catch MyErrorType.ErrorReason2 {
print("错误原因: 2")
}catch {
print("错误原因: 3")
}
2.使用结构体为错误处理添加Reason
- 使用结构体来遵循ErrorType协议, 可以在抛出错误时,给自定义错误类型提供错误原因。
- 2.1使用结构体创建错误类型,下方名为MyErrorType的结构体遵循了ErrorType协议,并且在MyErrorType结构体中,声明了一个reason常量,该reason常量中存储的就是错误原因
struct MyErrorType2: ErrorType {
let reason1: String
let reason2: String
}
- 2.2上面定义完错误类型结构体后,在错误抛出中就可以使用了。在错误抛出时,可以传入一个错误原因
func throwError2() throws {
let test: Int? = nil
guard test != nil else {
throw MyErrorType2(reason1: "原因1", reason2: "原因2")
}
}
- 2.3最后要对抛出的错误进行do-catch处理,在处理时,可以对错误原因进行打印,错误原因存储在error中
do {
try throwError2()
} catch {
print(error)
}
3.使String类型遵循ErrorType协议,直接使用String提供错误原因
extension String: ErrorType {
}
func throwError3() throws {
let test: Int? = nil
guard test != nil else {
throw "error"
}
}
do {
try throwError3()
} catch {
print(error)
}