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. magento获取页面url的办法还有magento的常用函数

    <?php echo $this->getStoreUrl('checkout/cart');?> 获取结账页面的url:<?php echo $this->getUrl ...

  2. Python 结巴分词

    今天的任务是对txt文本进行分词,有幸了解到"结巴"中文分词,其愿景是做最好的Python中文分词组件.有兴趣的朋友请点这里. jieba支持三种分词模式: *精确模式,试图将句子 ...

  3. 矩阵基本运算的 Python 实现

    from...import与import区别在于import直接导入指定的库,而from....import则是从指定的库中导入指定的模块 import...as则是将import A as B,给予 ...

  4. 获取元素高度及定位js

    <script type="text/javascript">                                   $(window).scroll(f ...

  5. System program problem detected 解决

    每次开机都出现:System program problem detected 管理员权限打开:/etc/default/apport   su root   vim /etc/default/app ...

  6. UVa 103 Stacking Boxes --- DAG上的动态规划

    UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...

  7. 课堂所讲整理:输入输出流(I/O)2(修改版)

    package org.hanqi.ex; import java.io.*; public class TestFile2 { public static void main(String[] ar ...

  8. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

  9. 论文笔记之:MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching

    MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching CVPR  2015 本来都写到一半了,突然笔记本死机了 ...

  10. JavaScript的事件绑定及深入

     事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定 (DOM2 级模型).现代事件绑定在传统绑定上提供了更强大更方便的功能. 一.传统事件绑定的问题传统事件绑定有内联模型 ...