Swift版本:3.0+
前言
异常,简单理解就是应用程序报错了。在开发中,程序出现异常是很正常的,这就需要我们要有容错机制,在程序出现异常时做相应的处理,避免应用出现卡死、崩溃等问题。由于Swift是强类型的语言,所以对代码的容错处理机制要求更加严格和谨慎规范,如果不符合规范在编译阶段就会报错。
Swift中的异常标识
如果在调用一个方法时,该方法最后有一个throws
关键字,说明该方法会抛出异常。下面通过从项目中的JSON文件中获取数据初始化字符串的方法来讲解。首先看这个方法的声明:
// 通过本地JSON文件路径初始化字符串的方法声明
public convenience init(contentsOfFile path: String, encoding enc: UInt) throws
可以看到方法声明的最后添加throws
关键字,说明这个方法在使用的时候会出现异常,如下代码:
// 从项目中获取json文件路径
let jsonPath = Bundle.main.path(forResource: "jsonPathName", ofType: "json")
guard jsonPath != nil else {
print("从项目中获取json文件路径失败")
return
}
// 获取json文件路径成功,从json文件路径中获取数据
// 如果不加异常处理,下面这一句代码可能会报错
let jsonStr = NSString(contentsOfFile: jsonPath!, encoding: String.Encoding.utf8.rawValue)
如果一个方法会抛出异常,那么需要对该异常进行处理,如下讲解。
Swift中的异常处理
Swift中提供三种异常捕获机制:try
、try?
、try!
,简单来说就是手动捕获处理异常、系统捕获处理异常、不处理异常。
1. try方式:手动捕获处理异常
1> Swift提供了do{}catch{}
块的方式来手动捕获异常,do{}
块放所有可能出现异常的代码,在调用可能出现异常的方法前必须加上try
关键字。如果出现异常,catch{}
块中会自动捕获error
对象,error
中包含所有的异常信息,我们主要在这里面对异常进行处理。
2> 使用手动处理异常会造成do{}
块中的代码可阅读性差,但是可以在catch{}
块中针对特定的异常错误进行处理。
do {
// 从项目中获取json文件路径
let jsonPath = Bundle.main.path(forResource: "jsonPathName", ofType: "json")
guard jsonPath != nil else {
print("从项目中获取json文件路径失败")
return
}
// 从json文件路径中获取数据
let jsonStr = try NSString(contentsOfFile: jsonPath!, encoding: String.Encoding.utf8.rawValue)
// Todo...
} catch {
// error:异常的对象
print(error)
}
2. try?方式:系统捕获处理异常
try?
方式也是我们常用的方式,如果调用的方法出现了异常,则该方法返回nil。如果没有异常,则返回对应的对象。所以我们只需要根据系统给我们返回的内容,通过guard
表达式来做验证处理即可。
// 从项目中获取json文件路径
let jsonPath = Bundle.main.path(forResource: "jsonPathName", ofType: "json")
guard jsonPath != nil else {
print("从项目中获取json文件路径失败")
return
}
// 获取json文件路径成功,从json文件路径中获取数据
guard let jsonStr = try? NSString(contentsOfFile: jsonPath!, encoding: String.Encoding.utf8.rawValue) else {
print("从json文件中获取数据失败")
return
}
// 从json文件中获取数据成功,Todo...
3. try!方式:不处理异常
不建议使用try!
方式,非常危险。相当于你直接告诉系统该方法没有异常,但是如果该方法出现了异常,那么程序会崩溃。
// 从项目中获取json文件路径
let jsonPath = Bundle.main.path(forResource: "jsonPathName", ofType: "json")
guard jsonPath != nil else {
print("从项目中获取json文件路径失败")
return
}
// 获取json文件路径成功,从json文件路径中获取数据
// 如果该方法出现了异常,那么程序会崩溃
let jsonStr = try! NSString(contentsOfFile: jsonPath!, encoding: String.Encoding.utf8.rawValue)
总结
处理异常其实就三种方式try
、try?
、try!