`
calmness
  • 浏览: 353229 次
  • 性别: 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-NestyRuby的嵌套异常

    Ruby-NestyRuby的嵌套异常是关于Ruby...了解并熟练使用Nesty库可以提升你的Ruby异常处理能力,使代码更加健壮和易于维护。在实际开发中,合理利用嵌套异常处理能够帮助我们更有效地定位和解决问题,提高程序的稳定性。

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

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

    Ruby经典系列: exceptional 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的异常处理:优雅应对错误的艺术

    ### 掌握 Ruby 的异常处理:优雅应对错误的艺术 #### 引言 异常处理作为编程中的基础技能之一,在任何一种编程语言中都占有极其重要的地位。对于 Ruby 这种注重简洁性和可读性的语言而言,良好的异常处理机制更是不...

    详解Ruby中的异常

    begin...rescue...end结构是Ruby异常处理的核心。begin关键字标志着一段可能抛出异常的代码的开始。在这之后,程序会执行其中的代码块。如果代码块中的任何部分抛出了异常,那么控制权会立即转移到rescue子句。在...

    Ruby-Rails的异常通知插件

    在Ruby on Rails开发中,错误处理是至关重要的一个环节,因为它可以帮助开发者及时发现并修复问题,从而保持应用程序的稳定运行。"Ruby-Rails的异常通知插件"正是为了解决这个问题而诞生的。Exception Notification...

    Ruby-ParallelRuby让并行处理简单和快速

    "Parallel Ruby"库正是为此目的而设计,它使得在Ruby中实现并行处理变得简单且高效。 Parallel Ruby库是一个强大的工具,允许开发者在Ruby程序中并行运行任务,从而显著提升性能。这个库的核心理念是将工作分解成可...

    Ruby-Money一个Ruby库来处理货币和货币转换

    9. **错误处理**:在处理货币转换或计算时,如果出现无效的操作或错误的汇率数据,Money库会抛出相应的异常,帮助开发者及时发现并处理问题。 在实际使用中,开发人员可以通过简单的Ruby代码导入Money库,创建货币...

    Ruby 编程语言的书籍

    5. **异常处理进阶**:进一步探讨异常处理的高级用法,如自定义异常类、异常传递链等,帮助开发者写出更加健壮的应用程序。 6. **Ruby on Rails框架**:简要介绍如何利用Ruby on Rails这一流行的Web开发框架快速...

    Ruby-ngxruby是嵌入ruby脚本的Nginx模块

    7. **错误处理**:在Ruby脚本中处理异常和错误是必不可少的,因为任何未捕获的异常都可能导致Nginx服务中断。使用`rescue`来捕获并处理错误。 8. **日志记录**:利用Ruby的`puts`或其他日志库记录运行时信息,有助...

    Ruby-GemExceptionTrack捕捉Rails应用运行期的异常并存储到数据库

    3. **异常处理**:在编程中,异常是程序运行时出现的错误。Ruby提供了`begin-rescue-end`结构来捕获和处理异常。 4. **数据库存储**:ExceptionTrack将异常信息存储在数据库中,可能是为了方便持久化和批量分析,...

    Ruby-Raven是Sentry的一个Ruby客户端

    在Ruby开发中,错误处理是非常关键的部分,因为一个未被捕获的异常可能导致程序崩溃,影响用户体验。Raven-Ruby通过集成到你的应用程序中,可以在发生错误时自动捕获异常信息,如堆栈跟踪、环境变量、请求数据等,并...

    Ruby-forkoffruby简单的并行处理

    5. 最后,确保在适当的地方添加错误处理和资源清理代码,因为子进程可能会抛出异常,或者在完成任务后需要关闭打开的文件描述符等。 在压缩包`forkoff-master`中,可能包含了`ForkOff`库的源码,你可以通过查看源码...

    Ruby 教程 The Book of Ruby

    7. **异常处理** - 异常的基本概念 - 如何定义和捕获异常 - 自定义异常 8. **测试与调试** - 单元测试框架的使用 - 调试技巧与工具 9. **项目实战** - 通过实际项目案例巩固所学知识 - 最佳实践与代码规范 ...

    From Java to Ruby

    在错误处理方面,Ruby使用异常(Exception),这一点与Java相同。然而,Ruby鼓励使用异常来控制程序流程,而在Java中,过度使用异常会被视为不良实践。 在开发工具和生态系统方面,Java有成熟的IDE如Eclipse和...

    ruby(前途大好的ruby+rains)

    7. **异常处理**:Ruby提供了异常处理机制,通过`begin..rescue..end`结构捕获和处理运行时错误。 8. **标准库丰富**:Ruby的标准库包含了大量实用的模块和类,如文件操作、网络通信、XML解析等,为开发者提供了...

    《Ruby Programming—向Ruby之父学程序设计(第2版)》电子书

    此外,书中还会涵盖Ruby的异常处理机制,这对于编写健壮的代码至关重要。异常处理允许程序员捕获并处理运行时错误,防止程序意外终止。同时,书中也会介绍Ruby的块(blocks)、Proc对象和Lambda,这些都是Ruby中处理...

    Ruby-Sneakers一个基于RubyRabbitMQ的快速后台处理框架

    6. **错误处理**:框架内置了错误处理机制,如重试、死信队列等,可以有效地处理异常情况。 7. **测试友好**:Sneakers提供了方便的测试工具,使得单元测试和集成测试变得简单。 在使用Sneakers时,开发者需要编写...

Global site tag (gtag.js) - Google Analytics