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前面.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索异常
, file
, 代码
, close
, 一个
, 异常处理:rescue
异常处理:ensure
,以便于您获取更多的相关知识。

时间: 2025-01-18 21:05:19

ruby异常处理:ensure的相关文章

ruby异常处理:rescue

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

ruby 异常处理:rescue_ruby专题

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

ruby 异常处理:ensure_ruby专题

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

详解Ruby中的异常_ruby专题

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

puppet的sudo模块

需求:每台服务器上都创建dev组,专门给开发人员,给特定的开发人员建账号,并加入dev组: 运维人员也将创建各自的用户,并加入wheel组,通过sudo来对组里成员做权限设置. 架构如下: manfests里面的文件内容如下: 1,init.pp class sudo { case $::osfamily { 'RedHat': { include "sudo::conf" import 'sudoers.pp' } default: { fail("$::osfamily

异常“Validation of ViewState Mac failed”及解决办法

项目顺利完成,到客户现场进行系统测试(使用VS2005进行压力测试和响应测试),在系统日志中出 现如下错误: [HttpException (0x80004005): Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey a

Ruby中的异常处理代码编写示例_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 def

ruby查缺补漏

<Programming Ruby中文版>前3部分我并不准备细看,毕竟我接触ruby也有一段时间了,只准备快速地掠过一遍,查缺补漏:重点放在第3部分的核心内容上,至于第四部分的参考手册更多作为工具书了.仅在此记录下一些值的注意的东西. 1.全局变量$_,默认当gets方法返回输入的行时,同时保存在全局变量$_,并且正则表达式如果作为条件语句(if或者while)时默认是跟这个全局变量进行匹配,而print参数为空时也是打印这个全局变量.这是早期ruby向perl语言学习的结果.可以看看这个例子

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

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