Swift笔记:异常处理

作者: Abnerzj | 来源:发表于2016-11-25 16:08 被阅读140次

    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!

    相关文章

      网友评论

        本文标题:Swift笔记:异常处理

        本文链接:https://www.haomeiwen.com/subject/yaiipttx.html