ruby 异常处理:rescue

 更新时间:2007年11月24日 14:21:27   作者:  
 一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据.

ruby> file = open("some_file")
ERR: (eval):1:in `open': No such file or directory - some_file  


一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定.

FILE *file = fopen("some_file", "r");
if (file == NULL) {  
fprintf( stderr, "File doesn't exist.\n" );  
exit(1);
}
bytes_read = fread( buf, 1, bytes_desired, file );
if (bytes_read != bytes_desired ) {  
/* do more error handling here ... */
}
...  


这项无聊的工作会使程序员最终变得马虎并忽略掉它,结果是程序无法应对异常.令一方面,这样也会降低程序的可读性.因为过多的错误处理使有意义的代码也变得杂乱了.

在Ruby里,就像其它的现代语言,我们可以通过隔离的办法处理代码域里的异常,因此,这有着惊人的效果却又不会为程序员或以后希望读它的其它人造成过度的负担.代码域由begin开始直到遇到一个异常,这将导致转向一个由rescue标记的错误处理代码域.如果异常没发生,rescue代码就不会使用.下面的代码返回文本文件的第一行,如果有异常则返回 nil.

def first_line( filename )
  begin
    file = open("some_file")
    info = file.gets
    file.close
    info  # Last thing evaluated is the return value
  rescue
    nil   # Can't read the file? then don't return a string
  end
end  


有时我们会希望围绕问题展开创造性工作.这里,如果文件不存在,我们用标准输入代替:

begin
  file = open("some_file")
rescue
  file = STDIN
end
begin
  # ... process the input ...
rescue
  # ... and deal with any other exceptions here.
end  


retry 用于 rescue 代码表示又重新执行 begin 代码.这让我们可以压缩前面的例子:

fname = "some_file"
begin
  file = open(fname)
  # ... process the input ...
rescue
  fname = "STDIN"
  retry
end  


但这仍有一点瑕疵.一个不存在的文件将导致不停止地 retry.你在使用 retry 做异常处理时应注意到这一点.

每个Ruby库在遇到错误时都会提交一个异常,你可以在自己的代码里明确地提交异常.用 raise 来提交异常.它带一个参数,也就是描述异常的一个字符串.参数是可选的但不应被省略.之后它可以通过一个特殊的全局变量 $! 访问.

ruby> raise "test error"
   test error
ruby> begin
    |   raise "test2"
    | rescue
    |   print "An error occurred: ",$!, "\n"
    | end
An error occurred: test2
   nil   

 

相关文章

  • Ruby中检测Gem是否安装的方法

    Ruby中检测Gem是否安装的方法

    这篇文章主要介绍了Ruby中检测Gem是否安装的方法,本文直接给出实现代码以及使用方法,需要的朋友可以参考下
    2015-01-01
  • 详解Ruby当中的算数运算

    详解Ruby当中的算数运算

    这篇文章主要介绍了详解Ruby当中的算数运算,是Ruby学习当中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Ruby on Rails基础之新建项目

    Ruby on Rails基础之新建项目

    Ruby on Rails 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架。下面我们就来看看如何简单便捷的使用这一框架,本系列文章将一一为大家揭秘
    2016-02-02
  • 使用Ruby实现FTP密码破解

    使用Ruby实现FTP密码破解

    本文给大家详细讲解了如何使用ruby来实现FTP的暴力破解,记录了破解器从思路到最终实现的全部过程,原理其实很简单,就是利用多线程调用相应的字典进行穷举测试,有需要的小伙伴可以参考下
    2017-04-04
  • Ruby解析处理YAML和json格式数据

    Ruby解析处理YAML和json格式数据

    这篇文章主要介绍了Ruby对YAML和json格式的数据处理方法,json序列化、json反序列化,json解析等操作,需要的朋友可以参考下
    2022-04-04
  • Java 版的 Ruby 解释器 JRuby 1.7.14 发布

    Java 版的 Ruby 解释器 JRuby 1.7.14 发布

    JRuby,一个采用纯Java实现的Ruby解释器,由JRuby团队开发。它是一个自由软件,在CPL/GPL/LGPL三种许可协议下发布。
    2014-08-08
  • Ruby的安装与运行

    Ruby的安装与运行

    本文给大家分享的是ruby的基础知识,是学习ruby必须掌握的ruby的安装和运行以及ruby的文档,非常实用,有需要的小伙伴可以参考下。
    2016-02-02
  • Ruby编程中的语法使用风格推荐

    Ruby编程中的语法使用风格推荐

    这篇文章主要介绍了Ruby编程中的语法使用风格推荐,好的代码书写风格有助于debug等工作的进行,需要的朋友可以参考下
    2015-08-08
  • 解析proxy代理模式在Ruby设计模式开发中的运用

    解析proxy代理模式在Ruby设计模式开发中的运用

    这篇文章主要介绍了proxy代理模式在Ruby设计模式开发中的运用,通过代理模式以客户透明的形式可以动态地为目标对象加以行为控制,需要的朋友可以参考下
    2016-04-04
  • Ruby基础知识之类

    Ruby基础知识之类

    这篇文章主要介绍了Ruby基础知识之类,本文讲解了类的创建、访问器、类变量、常量、类方法、方法的访问性、工厂方法、模块module等内容,需要的朋友可以参考下
    2015-04-04

最新评论