iOS程序猿iOS Developer

Swift笔记:异常处理

2016-11-25  本文已影响140人  Abnerzj

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中提供三种异常捕获机制:trytry?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)

总结

处理异常其实就三种方式trytry?try!

上一篇 下一篇

猜你喜欢

热点阅读