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. javascript js表示中文日期的经典写法

    <div id="time"> <script>document.getElementById('time').innerHTML=new Date().t ...

  2. 本地安装git

    在ubuntu上安装git特别简单 首先用命令查看是否安装git 在终端输入 git 如果没有安装 sudo apt-get install git 安装完之后,测试是否安装成功: git --ver ...

  3. break return

    用 break  跳出循环 用 return 跳出函数 用 continue 结束本次循环开始下次循环

  4. 三分钟了解Activity工作流

    一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ...

  5. python学习笔记 - assert用法

    [转自]http://blog.sina.com.cn/s/blog_76e94d210100vz37.html   1.assert语句用来声明某个条件是真的. 2.如果你非常确信某个你使用的列表中 ...

  6. 转载:奇异值分解(SVD) --- 线性变换几何意义(下)

    本文转载自他人: PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理 ...

  7. iPhone 上拨号键盘的发音规律

    上个学期在信号处理课上选做的题目和这个问题正好相关. 如焕杰同学所说,iPhone拨号音是使用双音多频信号(DTMF).双音多频信号是贝尔实验室发明的,通常用于发送被叫号码,它取代了早起的脉冲拨号方法 ...

  8. 图像质量评价指标之Matlab实现

    在图像处理算法研究中,很多时候需要有客观评价指标来对算法的性能进行评价. 比如,在图像复原.图像滤波算法研究中,需要采用客观评价指标来定量的来测试算法恢复出的图像相对于参考图像的好坏程度. 本文介绍文 ...

  9. jq hover方法用法 例子

    <script type="text/javascript">    $(function(){        $('.caseslist').hover(functi ...

  10. 【渗透测试学习平台】 web for pentester -2.SQL注入

    Example 1 字符类型的注入,无过滤 http://192.168.91.139/sqli/example1.php?name=root http://192.168.91.139/sqli/e ...