`

raise-Ruby 异常处理(转载)

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

ruby中异常的抛出是使用的raise方法,记住哦,这是个方法,由ruby Kernel提供的,而不是关键字,同时ruby也为这个方法提供了一个别名fail,可以用fail代替raise,抛出异常的例子如下:
Ruby代码

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这个数组中,里面包含了方法调用者的相关信息,第一个元素包 含了方法的调用者的信息,第二个信息包含了方法调用者的调用者的信息,以此类推。这个数组在我们想知道异常是在哪个地方的哪个调用被抛出的时候非常有用 的。

Ruby代码
 

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关键字进行捕捉异常类型,注意哦,这个是关键字,而不是方法。
Ruby代码
begin 
    ......                               #可能出现异常的代码  
rescue  errorType1            #要捕捉的异常类型  
    ......                               #处理异常的代码  
rescue  errorType2            #要捕捉的异常类型  
    ......                               #处理异常的代码  
end 


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

begin
    ......                               #可能出现异常的代码
rescue  errorType1            #要捕捉的异常类型
    ......                               #处理异常的代码
rescue  errorType2            #要捕捉的异常类型
    ......                               #处理异常的代码
else
    ......                               #如果以上代码类型都没有捕捉到,则运行该段代码
end

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


通过rescue => variable的方式,就可以将异常保存为一个variable了。又解决了一个问题,还有什么问题呢?啊,对了,在java的使用当中,比如使用 Connection进行数据库连接后,最后一定要进行资源的清理,都是在finally块当中进行的,可是在ruby中又如何进行这些资源的清理呢?看 看下面的代码:
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。
分享到:
评论

相关推荐

    Python学习--异常处理思维导图

    Python学习--异常处理思维导图!!来源于网易云课堂王顺子

    精品课件-Python常见异常处理.pptx

    理解 掌握 掌握 掌握 学习目标 理解异常的概念 1 2 掌握处理异常的几种方式 掌握raise和assert语句,会抛出自定义的异常 3 4 掌握with和as环境安装器的使用 精品课件----Python常见异常处理全文共71页,当前为第2页...

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert

    Python零基础速成班,适用于入门或初级学习人群,采用Jupyter Notebook原装教程,.ipynb格式拷贝到Jupyter Notebook目录下即可运行,网页交互式可视化Python编程,全中文注解,下载即用,对初学者非常友好,也可作为...

    raise-alarm:向该页面上连接的所有客户端发出警报

    $ npm install raise-alarm -g $ raise-alarm 选项 -h, --help output usage information -V, --version output the version number -p, --port [number] specified the port 服务器 $ git clone --depth=1 --...

    HLRaiseToTalk:使用运动和接近检测器实现 Raise-To-Talk 行为

    根据对设备的接近度和运动传感器的智能监控,向您的应用程序添加 Raise-To-Talk 手势检测。 如果检测到举起讲话手势,则支持通知。 用法 要运行示例项目, pod install克隆 repo,然后从 Example 目录运行pod ...

    Python 异常机制 09_自定义异常类_raise抛出异常.mp4

    Python 异常机制 09_自定义异常类_raise抛出异常.mp4

    程序异常处理与调试技术

    7.1.1 使用Try-Except语句处理异常 7.1.2 Try_Finally 结构 7.1.3 异常基类及其属性和主要方法 7.1.4 Raise语句和异常处理的重引发 7.2 程序调试 7.2.1 调试的准备 7.2.2控制程序的执行 7.2.3 使用...

    bugsnag-ruby-ext:Bugsnag Ruby客户端的扩展

    bugsnag-ext Bugsnag的有用扩展。 安装 将此行添加到应用程序的Gemfile中: gem 'bugsnag-ext' 然后执行: ... use FaradayMiddleware :: Bugsnag # Need to set before :raise_error faraday .

    c,c++异常处理

    c,c++程序设计异常处理,希望可以对大家有用,提高大家对异常的处理能力。

    RAISE-reading-resources

    此仓库包含负责任的AI系统和体验(RAISE)阅读小组的论文。 涵盖的主题包括(但不限于): 转移学习与转移 偏见与公平 可解释性 转移学习与转移 (02/2021)移植的 (06/2020) (02/2020) 陈述的可转移性 (02/...

    Raise-crx插件

    购买并保存官方的Raise Chrome扩展程序! 在线购物时,请使用Raise Chrome扩展程序,以找到最优惠的价格和折扣,以便在结账时使用。 Raise会自动为您匹配最佳的礼品卡,以便在Raise.com上购买,迄今为止,我们的会员...

    Angry_raise:以情感和强度引发Ruby异常

    raise异常,情绪激动 用法 require "angry_raise" raise! "an error occured" # "RuntimeError: an error occured!" raise! SomeError , "an error occured" # "SomeError: an error occured!" raise! SomeError . ...

    raise-your-dongers

    提高你的冬日 这是使用构建的 reddit 机器人示例 设置指南发布在此处: 感谢 Jonathan LeBlanc 的 Reddit PHP 包装器: :

    Oracle中RAISE异常深入分析

    显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在程序中使用下面的语句: ...

    Python语言基础:异常.pptx

    如果这些错误得不到正确的处理将会导致程序终止运行,所以本结需要学习Python强大的异常处理机制,合理地使用异常处理可以使程序更加健壮,具有更强的容错性,不会因为错误地输入或运行时遇到的问题而造成程序终止。...

    centos72_jb51_centos7的安装包_minimal_

    c875b0f1dabda14f00a3e261d241f63e CentOS-7-x86_64-DVD-1511.isodba29c59117400b111633be2bf2aaf0e CentOS-7-x86_64-Everything-1511.iso7e46208ba6c5fe817a3ce981aa122f54 CentOS-7-x86_64-LiveGNOME-1511.isod9f...

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

    单个异常使用 fail 关键字仅仅当捕获一个异常并且反复抛出这个异常(因为这里你不是失败,而是准确的并且故意抛出一个异常)。 begin fail 'Oops' rescue => error raise if error.message != 'Oops' end  ...

    Python中的异常处理try/except/finally/raise用法分析

    本文实例分析了Python中的异常处理try/except/finally/raise用法。分享给大家供大家参考,具体如下: 异常发生在程序执行的过程中,如果python无法正常处理程序就会发生异常,导致整个程序终止执行,python中使用try...

    Raise-The-Flag-Simulator:警告! 为我们的同志高兴

    提高旗标模拟器警告! 为我们的同志们感到高兴。 哦...我们可以听到我们湿wet的大象的性感声音,并体验宽恕的色彩带来的技术便利。 同志们,仪式即将结束时,请不要忘记您的物品。 请不要沉迷。...

Global site tag (gtag.js) - Google Analytics