`
calmness
  • 浏览: 350486 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Ruby 异常处理

    博客分类:
  • Ruby
阅读更多
       异常处理是开发过程中经常要面对的问题,基本所有高级语言都有自己的异常处理系统,ruby也不例外,而且使用起来也非常简单。

        ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
raise                                                       #抛出一个默认的RuntimeError
raise "Some error message"                   #抛出一个消息为"Some error message"的RuntimeError
raise ArgumentError                                #抛出一个无消息的ArgumentError
raise ArgumentError, "Bad data"           #抛出一个消息为"Bad data"的ArgumentError
raise ArgumentError.new("Bad data")    #同上
raise ArgumentError ArgumentError, "Bad data", caller[0]  #抛出一个包含消息的格式为filename:line 或者 filename:line:in 'method' 的异常 


        以上代码中的raise可以使用别名fail代替,在没有明确的给出异常类型时,ruby默认抛出RuntimeError,其中最后一个例子抛出的信息包含了当前错误所在的文件,行数已经所在的方法的信息,这些信息都存储在caller这个数组中,里面包含了方法调用者的相关信息,第一个元素包含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用的。

       
def func1
puts caller            #打印调用者信息
end

def func2
func1                    #第六行
end

def func3
func2                    #第十行
end

func3                    #最终调用者,十三行

#运行结果
#test.rb:6:in `func2'
#test.rb:10:in `func3'
#test.rb:13

        从上面的代码可以看出,caller记录了每个调用者所在的文件名,行数以及方法。

        上面讲解了关于ruby异常抛出的方式以及caller数组的作用,接下来我们来了解一下ruby中是如何进行异常的捕捉的,在java中,异常的捕捉是在try ... catch当中进行,而ruby则是在begin ... end代码块中进行异常的捕捉,在该代码块中使用rescue关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
begin
    ......                               #可能出现异常的代码
rescue  errorType1            #要捕捉的异常类型
    ......                               #处理异常的代码
rescue  errorType2            #要捕捉的异常类型
    ......                               #处理异常的代码
end

        以上代码就是一个大概的捕捉异常的例子,在begin和end代码块中通过rescue进行异常类型的捕捉然后进行适当的处理,可是如果抛出的异常类型并没有显示的捕捉如何处理呢?那就是在最后使用else,如下:
begin
    ......                               #可能出现异常的代码
rescue  errorType1            #要捕捉的异常类型
    ......                               #处理异常的代码
rescue  errorType2            #要捕捉的异常类型
    ......                               #处理异常的代码
else
    ......                               #如果以上代码类型都没有捕捉到,则运行该段代码
end

        这时又有一个问题,如果我想获取异常信息又该如何做呢?请看下面的代码:
begin
   raise ArgumentError, "Bad data"
rescue => err
  puts err
end

       通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看看下面的代码:
begin
   raise ArgumentError, "Bad data"
rescue => err
  puts err
ensure
  ...                       #执行清理工作
end

        从上面代码我们看到,ruby提供了一个关键字ensure,它的作用和java中的finally一样,无论任何异常,该关键字下的代码都必然会在退出代码块前执行。同时,ruby还提供恢复功能,如果在抛出异常并进行异常处理后我们需要进行恢复工作,那就是使用retry就会重新执行代码块了。

        上面提到,异常的捕捉处理必须在begin-end代码块中进行,那是不是无论什么时候都要书写begin-end这两个关键字呢?其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。

        本文参考——《The Ruby Way》
3
2
分享到:
评论
2 楼 hexawing 2013-06-25  
其实也不是,在 ruby中,方法实际上就是一个隐式的begin-end代码块,所以在方法中进行异常的捕捉和处理,可以省略begin。


真的可以省略吗?没有begin不就直接执行第一句有错误的代码了吗?那还怎么rescue啊……
1 楼 yuan 2009-08-27  
ruby1.9已经不能再使用retry了,从ruby1.8.7开始已经deprecate了。

相关推荐

    ruby-snmp, SNMP ( 简单网络管理协议)的ruby 实现.zip

    ruby-snmp, SNMP ( 简单网络管理协议)的ruby 实现 用于 ruby的 SNMP库摘要这里库实现 SNMP ( 简单网络管理协议) 。 它在纯 ruby 中实现,因此不依赖于的外部库( 如 ) 。 你可以在 ruby 可以运行的任何地方运行这里库...

    ruby 异常处理:ensure

    但一个方法可能从多个地方返回,或者因为异常我们的清理代码被意外跳过. begin file = open(“/tmp/some_file”, “w”) # … write to the file … file.close end 上面,如果在我们写文件的时候发生异常,...

    ruby 异常处理:rescue

    ruby> file = open(“some_file”) ERR: (eval):1:in `open’: No such file or directory – some_file 一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求...

    Ruby-NestyRuby的嵌套异常

    Nesty - Ruby的嵌套异常

    Ruby-Rails的异常通知插件

    Exception Notification - Rails的异常通知插件。能够在Rack/Rails应用发生错误时发送通知。

    ruby教程.rar

    控制结构/异常处理 方法调用 类/方法的定义 标准库 内部函数 内部变量 内部常数 内部类/模块/异常类 附加库 Ruby变更记录 ruby 1.6 特性 ruby 1.7 特性 ruby 1.8 特性 1.6.8到1.8.0的变更点(总结) ...

    【09-异常处理】

    •异常处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++、C#、Ruby、 Python等,大都提供了异常处理机制。增加了异常处理机制后的程序有更好的容错性,更加健壮。 传统错误处理的缺陷 ...

    Ruby常见面试题.pdf

    请说明在Ruby中的异常处理机制。 8. Ruby中的数组(Array)和哈希(Hash)有什么区别?请说明在Ruby中数组和哈希的不同特点。 9. 什么是Ruby中的块(Block)和迭代器(Iterator)?请简要介绍在Ruby中块和迭代器的...

    Ruby经典系列: exceptional ruby

    Ruby经典系列: exceptional ruby 教你在ruby代码中如何处理异常

    免费的一本好书关于Ruby学习

    5. **异常处理**:Ruby 支持异常处理机制,开发者可以轻松地捕获和处理异常,保证程序的稳定性和可靠性。 6. **丰富的标准库**:Ruby 标准库提供了大量内置模块和库,涵盖了网络编程、文件操作、数据处理等各个领域...

    Ruby中的异常处理代码编写示例

    主要介绍了Ruby中的异常处理代码编写示例,作者对异常处理的方式给出了一些比较通用的建议,需要的朋友可以参考下

    Ruby编程语言

     5.6异常和异常处理154  5.7BEGIN和END165  5.8线程、纤程和连续体166  第6章方法、PROC、LAMBDA和闭包175  6.1定义简单方法177  6.2方法名180  6.3方法和圆括号183  6.4方法参数185  6.5PROC和LAMBDA192 ...

    ruby学习资料大全,很全很丰富

    Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 ...异常处理模式 动态装载 线程

    rails_exception_handler:Ruby on Rails的异常处理

    Rails异常处理程序 从版本1升级? 这是Rails的灵活异常处理程序,适用于希望创建自己的错误跟踪服务的人员。 它面向经验丰富的Rails开发人员,这些开发人员不仅要管理几个Rails应用程序,而且还要管理多个应用程序。...

    详解Ruby中的异常

    我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型。 语法 begin # - rescue OneTypeOfException # - rescue AnotherTypeOfException # - else # 其他异常

    Ruby学习笔记(学习心得)

    Ruby学习笔记 01 类的属性与方法 02 访问控制 03 Container(Array/Hash) 04 Iterator 05 简单数据类型 06 范围 07 方法 08 条件控制 09 异常处理

    ruby语法基础教程

    §9.1 异常处理 64 §9.2 定义异常类 68 §9.3 catch和throw 68 第十章 多任务处理 69 §10.1 多线程处理 69 §10.1.1 线程创建 69 §10.1.2 线程操作 70 §10.1.3 线程和异常 71 §10.1.4 线程调度 73 §10.1.5 ...

    非常好的Ruby中文版项目资源,分享出来.zip

    这是 Ruby User’s Guide的简体中文版本:Ruby用户指南。 本指南基于Mark Slagell的英文译本翻译而来,指南最初的版本由Ruby的发明者Yukihiro Matsumoto用日语编写完成。...异常处理:ensure 访问器 对象初始化

Global site tag (gtag.js) - Google Analytics