ruby 异常处理:ensure

当一个方法结束工作时我们也许需要进行清理工作.也许一个打开的文件需要关闭,缓冲区的数据应清空等等.如果对于每一个方法这里永远只有一个退出点,我们可以心安理得地将我们的清理代码放在一个地方并知道它会被执行;但一个方法可能从多个地方返回,或者因为异常我们的清理代码被意外跳过.

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
  file.close
end

上面,如果在我们写文件的时候发生异常,文件会保留打开.我们也不希望这样的冗余出现:

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
  file.close
rescue
  file.close
  fail # raise an exception
end

这是个笨办法,当程序增大时,代码将失去控制,因为我们必须处理每一个 return 和 break,.

为此,我们向"begin...rescue...end"体系中加入了一个关键字 ensure. 无论begin块是否成功,ensure代码域都将执行.

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
rescue
  # ... handle the exceptions ...
ensure
  file.close   # ... and this always happens.
end

可以只用ensure或只用rescue,但当它们在同一begin...end域中时, rescue 必须放在 ensure前面.

(0)

相关推荐

  • ruby 异常处理:rescue

    一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据. ruby> file = open("some_file") ERR: (eval):1:in `open': No such file or directory - some_file 一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定. FILE *file =

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

    单个异常使用 fail 关键字仅仅当捕获一个异常并且反复抛出这个异常(因为这里你不是失败,而是准确的并且故意抛出一个异常). begin fail 'Oops' rescue => error raise if error.message != 'Oops' end 不要为 fail/raise 指定准确的 RuntimeError. # bad fail RuntimeError, 'message' # good - signals a RuntimeError by default fai

  • 详解Ruby中的异常

    异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止. Ruby 提供了一个完美的处理异常的机制.我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型. 语法 begin # - rescue OneTypeOfException #

  • ruby 异常处理:ensure

    当一个方法结束工作时我们也许需要进行清理工作.也许一个打开的文件需要关闭,缓冲区的数据应清空等等.如果对于每一个方法这里永远只有一个退出点,我们可以心安理得地将我们的清理代码放在一个地方并知道它会被执行;但一个方法可能从多个地方返回,或者因为异常我们的清理代码被意外跳过. begin   file = open("/tmp/some_file", "w")   # ... write to the file ...   file.close end 上面,如果在我们

  • Terry七月Ruby读书笔记(比较详细)第1/4页

    Page 3 概述 ¨         解释执行:Python,Ruby,交互性很好: ¨         编译执行:Pascal, C,速度较快. n         本地执行,如C,C++: n         虚拟机执行,如Java, C#. ¨         动态语言,如JavaScript,Ruby: ¨         静态语言,如C++,Java. 语言 ¨         语法 关键字 ¨         语义 ¨         语用 松本行弘(Matz) 1993 Ruby

  • 用实际代码演示Ruby的容易被误解的6个特性

    简介: 假设您是一名 C++ 开发人员,您需要使用 Ruby 快速执行一些原型设计.当您拿起一本 Ruby 参考书籍(比如 Pickaxe)或浏览 Ruby 网站时,会看到一些熟悉的构造,比如类声明.线程支持和异常处理.正当您认为自己了解 Ruby 的工作原理之时,您意识到了,您 Ruby 代码中的并发机制与 Boost 线程工作原理不一样,catch 和 throw 也与它们看上去的大不相同,而且其他人在其 Ruby 脚本中各处使用了名为 self 的关键词.欢迎来到 Ruby 的世界中! 如

  • 初步了解一下什么是ruby

    关键字 def undef 方法定义 module 模块定义 class 类定义 defined? 检查类型 条件语句 if,then,else,elsif,case,when,unless 循环语句 for ,in,while,until,next,break,do,redo,retry,yield 逻辑判断 not ,and ,or 逻辑或空值 true,false,nil 异常处理 rescue,ensure 对像引用super ,self 嵌入模块BEGIN END 块的起始 begin

  • Ruby多线程库(Thread)使用方法详解

    Thread是Ruby的线程库,Thread库已经内置在Ruby中,但如果想要使用线程安全的Queue.Mutex以及条件变量等,则需要手动require 'thread'. 主线程main 默认情况下,每个Ruby进程都具备一个主线程main,如果没有创建新的线程,所有的代码都将在这个主线程分支中执行. 使用Thread.main()类方法可获取当前线程组的主线程,使用Thread.current()可以获取当前正在执行的线程分支.使用Thread.list()可获取当前进程组中所有存活的线程

  • CentOS 7下配置Ruby语言开发环境的方法教程

    本文跟大家分享的是在CentOS 7下配置Ruby语言开发环境的方法教程,分享出来供大家参考学习,下面来看看详细的介绍: 安装Ruby 2.2 CentOS7存储库中的Ruby版本为2.0,但如果需要,可以使用RPM软件包安装2.2 1.添加CentOS SCLo软件集合存储库 [root@linuxprobe ~]# yum -y install centos-release-scl-rh centos-release-scl # set [priority=10] [root@linuxpr

  • 详解Ruby中的循环语句的用法

    Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code end 当 conditional 为真时,执行 code.while 循环的 conditional 通过保留字 do.一个换行符.反斜线 \ 或一个分号 ; ,来与 code 分离开. 实例 #!/usr/bin/ruby $i = 0 $num = 5 while $i < $num do puts("

随机推荐