建站极客
脚本专栏 ruby专题 正文
ruby 异常处理:rescue
所属分类:
脚本专栏 / ruby专题
阅读数:
1722
收藏 0
赞 0
分享
一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据. 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中常用的字符串处理函数使用实例 这篇文章主要介绍了Ruby中常用的字符串处理函数使用实例,本文总结了Ruby中最常用的字符串处理函数,如返回字符串的长度、判断字符串中是否包含另一个串、字符串插入、字符串分隔、默认分隔符为空格等内容,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
Windows下ruby语言安装教程 这篇文章主要介绍了Windows下ruby语言安装教程,本文使用rubyinstaller提供的安装包安装,并给出图文说明,非常简单,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
ruby环境中自动编译sass教程 这篇文章主要介绍了ruby环境中自动编译sass教程,本文讲解了ruby环境的安装、sass环境的安装以及sass的常用编译命令使用示例,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
Ruby中相等性判断的4种方法 这篇文章主要介绍了Ruby中相等性判断的4种方法,本文讲解了“==” 最常见的相等性判断、“===” 用于 case 语句的相容判断、“equal?” 相同对象判断、“eql?” 对象 hash 值判断等内容,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
Ruby中的p和puts的使用区别浅析 这篇文章主要介绍了Ruby中的p和puts的使用区别浅析,本文用一个实例讲解了它们之间的区别,并总结出结论,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
Ruby中的block、proc、lambda区别总结 这篇文章主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
Ruby的运算符和语句优先级介绍 这篇文章主要介绍了Ruby的运算符和语句优先级介绍,本文先是给出了一些小例子来验证运算符和语句优先级,然后总结出一个优先级表,需要的朋友可以参考下
评论 0
收藏 0
赞 0
分享
查看更多