文明之精神,野蛮之体魄。
全部博文(64)
分类: Python/Ruby
2013-05-09 10:25:44
一、 异常概述
1. 一个健壮的软件产品,应该能充分应对各种情况,而不是只能应对正常的情况。异常处理机制让程序按既定计划执行,当程序运行到无法运行的代码时,系统自动创建一个异常对象,该异常对象被提交给Ruby解释器,这个过程被称为引发异常。
二、 异常处理流程
1. 使用rescue捕捉异常。rescue用于指定一个异常处理块。当Ruby解释器遇到一个未处理的异常时,系统转入rescue指定的异常处理块。必须指出的是,即使我们为一段代码块指定多个异常处理块,也永远只有一个异常处理块被执行,永远是第一个匹配异常实例的rescue异常捕捉块获得执行,因此我们不要把一个异常父类的rescue块排在异常捕捉队列的前面。Ruby还允许我们获得系统引发的异常实例,我们可以采用“raise异常类=>实例名”的方式来获得引发的异常实例。
2. Ruby程序中所有异常都是Exception类的子类,而Exception包含如下几个常用方法:backtrace:返回该异常关联的异常栈信息。new:创建一个异常实例。to_s/to_str/message:返回该异常实例里的message信息,如果该异常实例没有货的系统的异常实例,则返回该异常的类名。为了获得系统的异常实例,Ruby还提供了一个全局变量$!,这个全局变量保存了系统最近发生的异常对象;还提供了一个全局变量$@,它保存了发生异常的源代码位置。
3. 异常处理机制:如果一个方法在执行过程中出现异常,则系统立即在该方法内寻找对应的异常处理块,不管找到异常处理块与否,引发异常代码后面的代码将不会获得执行的机会。如果系统可以在该方法中找到对应异常处理块,则系统跳转到对应异常处理块,由异常处理块处理该异常,当异常处理块执行结束后,程序接着运行该方法内、异常处理块后面的代码。
4. 使用ensure回收资源。
5. 使用retry再次执行。当Ruby解释器在rescue部分遇到retry代码时,将跳回begin部分,再次执行业务功能部分。
三、 引发异常
1. 引发异常:采用Kernel模块中定义的raise方法来达到这个目的。语法格式如下:
2. rescue和raise同时使用。
四、 在程序定义中使用异常处理
1. 在类/模块定义中使用异常处理。如果我们在类定义中增加了异常处理流程,对该类里的方法没有任何帮助。
2. 在方法中定义异常处理。