begin
    #可能发生异常的地方
rescue
    #如何处理异常
end

rescue,哈哈,太有爱的一个单词了。。。

begin
    #可能发生异常的地方
rescue => exception
    #如何处理异常
end

这样一来,exception就可以用来存放异常对象了。

$!:用来存放最后一次发生的异常对象

$@:异常发生的位置等信息。

异常对象的方法:

class:例外的类别

message: 例外的消息

backtrace: $@等同于$!.backtrace,异常发生的位置信息

更加完善的异常处理

begin
    #process
rescue => ex
    #process on ex
ensure
    #无论如何都会执行的动作
end

※在ensure中可以使用retry,他会重新去执行begin中的内容,如果没有强制退出则一直执行。

rescue可以像if, unless一样使用如下形式:

n = Integer(val) rescue 0

#跟上面同样的效果
begin
  n = Integer(val)
rescue
  n = 0
end

如果val不是一个数字类型的字符串的话,n就等于0。

按照异常分类处理

begin
    #process
rescue Exception1, Exception2 => ex
    #process on ex
rescue Exception3, Exception4 => ex2
    #process on ex2
rescue => ex3
    #process on other kinds of exceptions
end

StandardError

这个类是Exception的自类,Exception还有其他的子类。但是rescue补救的知识StandardError类或者是其子类。

于是我们设计自己的异常的时候,需要首先继承这个StandardError。

class VoctralsError < StandardError; end

然后,其它的类可以继承这个VoctralsError类。

class Error1 < VoctralsError; end

引发异常raise

raise "Error Information"  #产生一个RuntimeError,"Error Information"作为异常的message;

raise SomeException  #产生一个SomeException

raise SomeException, "Error Information"  #产生一个SomeException,并设定其message为"Error Information"

raise

1)写在rescue之外,直接引发一个RuntimeError;

2)写在rescue内,再次引发导致该rescue发生的异常($!)。

throw和catch

catch(:some){
    #something before a :some throw
    throw :some
    #something after a :some throw
}

catch能够保证:some之前的代码顺利进行,当出现:some被throw之后,后面的代码不会执行。

看起来类似if。

但是可以用这个来打断一个多层循环:

catch(:test){
    loop{
        loop{
          ...
          if val != 0
            throw :test, val
          end
       }
    }    

throw有两个参数的时候,第二个参数作为catch的返回值。

Ruby Exception的更多相关文章

  1. ruby : Exception Notification

    https://github.com/smartinez87/exception_notification#sections Add the following line to your applic ...

  2. 《ruby编程语言》笔记2 对象

    ruby是一门非常纯粹的面向对象的语言:所有值都是对象,而且没有基本类型(primitive type)和对象类型的区别,这一点不同于其他语言.在Ruby中,所有对象都继承一个Object类,而且共享 ...

  3. 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)

    从nginx日志中进行url解析 /v1/test?param2=v2&param3=v3&time=2019-03-18%2017%3A34%3A14->{'param1':' ...

  4. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

    https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...

  5. Ruby的require相关知识

    1. 在调用require xxx之前,需要确定xxx这个gem已经安装过了(使用gem install xxx,安装位置可以使用gem env列出),或者xxx是Ruby内置的标准函数库(StdLi ...

  6. ruby + watir 自动化上传图片文件解决方案

    watir自动化捕获上传图片元素: require 'watir' include Watir require 'test/unit' class TC_recorded < Test::Uni ...

  7. ruby Errors & Exceptions

    When you first started coding, errors were probably the last thing you wanted to see. After all, it’ ...

  8. 【ruby】ruby基础知识

    Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for L ...

  9. Ruby 多线程探索实践与归纳总结

    Ruby 多线程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通 ...

随机推荐

  1. mysql 获得当前月1号的日期 和 0点日期方法

    day)) 当月0点时间:2015-12-01 00:00:00 day)) 当月1号时间:2015-12-01 10:45:22 day) 2015-12-01 <!-- 查询上月债权额度 - ...

  2. 决策树模型 ID3/C4.5/CART算法比较

    决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归.虽然将多棵弱决策树的Bagging.Random Forest.Boosting等tree ensembel 模型更为常见,但是“完 ...

  3. typeof、offsetof、container_of的解释

    链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of. container_of似乎就是为链表而生的,它的主要作用是根据一个结构体变量中的一个域成员变 ...

  4. Xen虚拟机磁盘镜像模板制作(二)—Windows Server 2008(2012)

    在<Xen虚拟机磁盘镜像模板制作(一)—Windows Server 2008(2012)>一文中,我们已经成功制作出了Windows Server磁盘镜像.下面我们说明下如何通过它来生成 ...

  5. Sublime text2如何设置快捷键让编写的HTML文件在浏览器预览?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:浪人链接:http://www.zhihu.com/question/27219231/answer/43608776来源:知 ...

  6. 关于 System.IO.FileAttributes 的 Reparse Points

    关于Reparse Points找到下面的解释,要是能有更进一步的解释说明就更好了 Reparse Points其实是一个用户自定义的数据集合,它可以包含在一个文件或目录中.这种格式的数据能够被特定的 ...

  7. IIS 7.0 下 httpMoudle 失效的问题

    在web.config里配置了: <system.web> <httpModules>  <add type="DevExpress.Web.ASPxClass ...

  8. Windows 10触摸板手势

    高級使用者試用 Windows 10 筆記本電腦的觸控板上的這些手勢: •選擇一項: 在觸控板上點擊. •滾動: 將兩根手指放在觸控板上,然後以水準或垂直方向滑動. •放大或縮小: 將兩根手指放在觸控 ...

  9. 2015GitWebRTC编译实录5

    2015.07.20 libaudio_encoder_interface/libaudio_decoder_interface 编译通过将encoder,decoder两个lib合并了,后面需要看看 ...

  10. ZOJ 1101 Gamblers

    原题链接 题目大意:一群人聚众赌博.每个人先分别押注不同的金额,可以相互借钱.开奖之后,如果某个人的押注的金额正好等于任何其他三个人金额总和,那这个人就赢得其他三个人的赌注.如果同时有两个以上的赢家, ...