码迷,mamicode.com
首页 > 编程语言 > 详细

Swift—do-try-catch错误处理模式-备

时间:2016-05-03 12:21:43      阅读:826      评论:0      收藏:0      [点我收藏+]

标签:

Swift 1.x的错误处理模式存在很多弊端,例如:为了在编程时候省事,给error参数传递一个nil,或者方法调用完成后不去判断error是否为nil,不进行错误处理。

 

 
  1. let contents = NSString(contentsOfFile: filePath,   
  2.   
  3.         Êencoding: NSUTF8StringEncoding, error: nil)//error参数传递一个nil  

 

 

 

或者

 

 
  1. var err: NSError?      
  2.   
  3. let contents = NSString(contentsOfFile: filePath,   
  4.   
  5.         Êencoding: NSUTF8StringEncoding, error: &err)   

 

 

 

不好的编程习惯,由于Objective-C和Swift 1.x没有强制处理机制,因此一旦真的发生错误,程序就会发生崩溃。

同样的从文件中读取字符串示例,如果使用Swift2错误处理模式代码如下:

 

 
  1. import Foundation  
  2.   
  3.    
  4.   
  5. do {        //要做一些操作  
  6.   
  7.     let str = try NSString(contentsOfFile: filePath,   
  8.   
  9.                              Êencoding: NSUTF8StringEncoding)    //要尝试做的事情  
  10.   
  11. } catch let err as NSError { //如果失败则进入catch代码块  
  12.   
  13.     err.description  
  14.   
  15. }  

 

 

 

do-try-catch这种错误模式与Java中异常处理机制非常类似,本意就是尝试(try)做一件事情,如果失败则捕获(catch)处理。

 

捕获错误

完整的do-try-catch错误处理模式的语法如下:

 

 
  1. do {  
  2.   
  3.     try 语句  
  4.   
  5.   成功处理语句组   
  6.   
  7. } catch 匹配错误 {  
  8.   
  9.     错误处理语句组  
  10.   
  11. }   

 

 

 

try 语句中可以产生错误,当然也可能不会产生错误,如果有错误发生,catch就会处理错误。catch代码块可以有多个,错误由哪个catch代码块处理是由catch后面的错误匹配与否而定的。错误类型的多少就决定了catch可以有多少。我们先介绍一下错误类型。

 

错误类型

Swift中错误类型必须遵从ErrorType协议,其次考虑到错误类型的匹配,它应该被设计成为枚举类型,枚举类型非常适合将一组相关值关联起来。

如果我们编写访问数据库表程序,实现对表数据插入、删除、修改和查询等操作,我们会需要类似如下代码的错误类型:

 

 
  1. enum DAOError: ErrorType {  
  2.   
  3.     case NoData  
  4.   
  5.     case PrimaryKeyNull  
  6.   
  7. }  

 

 

 

NoData表示没有数据情况,PrimaryKeyNull表示表的主键(Primary Key)为空情况。

那么我们就可以通过如下代码捕获错误。

 
    1. do {    
    2.   
    3.     //try 访问数据表函数或方法  
    4.   
    5. } catch DAOError.NoData {  
    6.   
    7.     print("没有数据。")  
    8.   
    9. } catch DAOError.PrimaryKeyNull {  
    10.   
    11.     print("主键为空。")  
    12.   
    13. }  
  1. 能放到try后面调用函数或方法都是有要求的,他们是有可能抛出错误,在这些函数或方法声明的参数后面要加上throws关键字,表示这个函数或方法可以抛出错误。

    声明抛出错误方法示例代码如下:

     

    1. //删除Note记录方法  
    2.   
    3. func remove(model: Note) throws {  
    4.   
    5.   ...  
    6.   
    7. }  
    8.   
    9. //查询所有记录数据方法  
    10.   
    11. func findAll() throws -> [Note] {  
    12.   
    13.     ...  
    14.   
    15. }  

     

     

     

    上述代码remove(_:)方法没有返回值,throws关键字放到参数后面。findAll()有返回值throws关键字放到参数和返回值类型之间。

     

    在函数或方法中抛出错误

    一个函数或方法能够声明抛出错误,是因为在函数或方法中产生并抛出了错误,这样函数或方法声明抛出错误才有实际的意义。

    在产生并抛出错误方式:

    • 在函数或方法中通过throw语句,人为地抛出错误。

    • 在函数或方法中调用的其他可以抛出错误函数或方法,但是没有捕获处理,会导致错误被传播出来。

      示例代码如下:

      1. //删除Note方法  
      2.   
      3. func remove(model: Note) throws {          
      4.   
      5.       
      6.   
      7.     guard let date = model.date else {        //判断抛出时候是有了guard语句  
      8.   
      9.         //抛出"主键为空"错误  
      10.   
      11.         throw DAOError.PrimaryKeyNull        
      12.   
      13.     }  
      14.   
      15.     //比较日期主键是否相等  
      16.   
      17.     for (index, note) in listData.enumerate() where note.date == date {  
      18.   
      19.         listData.removeAtIndex(index)  
      20.   
      21.     }  
      22.   
      23. }  
      24.   
      25.    
      26.   
      27. //查询所有数据方法  
      28.   
      29. func findAll() throws -> [Note] {          
      30.   
      31.       
      32.   
      33.     guard listData.count > 0 else {           //判断抛出时候是有了guard语句  
      34.   
      35.         //抛出"没有数据"错误。  
      36.   
      37.         throw DAOError.NoData            
      38.   
      39.     }  
      40.   
      41.     return listData  
      42.   
      43. }  
      44.   
      45.    
      46.   
      47. func printNotes() throws {               //声明抛出错误  
      48.   
      49.       
      50.   
      51.     let datas  = try findAll()          
      52.   
      53.     for note in datas {  
      54.   
      55.         print("date : \(note.date!) - content: \(note.content!)")  
      56.   
      57.     }  
      58.   
      59. }  
      60.   
      61. try printNotes()                   

       

       

       

    guard语句最擅长处理这种早期判断,条件为false情况下抛出错误。

    findAll()语句本身有可能产生错误,但是并没有使用catch语句捕获并处理,这样就导致了这个错误传播给该函数或方法的调用者,如果它的调用者也都不捕获处理,那么最后程序会出现运行期错误。

Swift—do-try-catch错误处理模式-备

标签:

原文地址:http://www.cnblogs.com/isItOk/p/5454251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!