`
guoming521579
  • 浏览: 15315 次
文章分类
社区版块
存档分类
最新评论

ruby 异常处理:rescue

 
阅读更多

一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据.

ruby> file = open("some_file")
ERR: (eval):1:in `open': No such file or directory - some_file


一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定.

FILE *file = fopen("some_file", "r");
if (file == NULL) {
fprintf( stderr, "File doesn't exist.\n" );
exit(1);
}
bytes_read = fread( buf, 1, bytes_desired, file );
if (bytes_read != bytes_desired ) {
/* do more error handling here ... */
}
...


这项无聊的工作会使程序员最终变得马虎并忽略掉它,结果是程序无法应对异常.令一方面,这样也会降低程序的可读性.因为过多的错误处理使有意义的代码也变得杂乱了.

在Ruby里,就像其它的现代语言,我们可以通过隔离的办法处理代码域里的异常,因此,这有着惊人的效果却又不会为程序员或以后希望读它的其它人造成过度的负担.代码域由begin开始直到遇到一个异常,这将导致转向一个由rescue标记的错误处理代码域.如果异常没发生,rescue代码就不会使用.下面的代码返回文本文件的第一行,如果有异常则返回 nil.

def first_line( filename )
begin
file = open("some_file")
info = file.gets
file.close
info # Last thing evaluated is the return value
rescue
nil # Can't read the file? then don't return a string
end
end


有时我们会希望围绕问题展开创造性工作.这里,如果文件不存在,我们用标准输入代替:

begin
file = open("some_file")
rescue
file = STDIN
end
begin
# ... process the input ...
rescue
# ... and deal with any…………………………………………………………………………

原文:http://www.verydemo.com/demo_c119_i2013.html

分享到:
评论

相关推荐

    ruby 异常处理:ensure

    但一个方法可能从多个地方返回,或者因为异常我们的清理代码被意外跳过. begin file = open(“/tmp/some_file”, “w”) # … write to the file … file.close end 上面,如果在我们写文件的时候发生异常,...

    非常好的Ruby中文版项目资源,分享出来.zip

    这是 Ruby User’s Guide的简体中文版本:Ruby用户指南。 本指南基于Mark Slagell的英文译本翻译而来,指南最初的版本由Ruby的发明者Yukihiro Matsumoto用...异常处理:rescue 异常处理:ensure 访问器 对象初始化

    RubyUsersGuide-zh:这是Ruby User’s Guide的简体中文版:Ruby用户指南

    目录迭代器面向对象的思考方法类继承重新定义方法访问控制单例方法模块过程对象变量全局变量实例变量局部变量类常量异常处理:rescue异常处理:ensure访问器对象初始化其他关于本指南版权信息贡献者名单Copyright (c...

    详解Ruby中的异常

    我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型。 语法 begin # - rescue OneTypeOfException # - rescue AnotherTypeOfException # - else # 其他异常

    rescue-dog:响应Rails的状态和错误处理

    包括Rescue::Controller (Rescue :: Controller :: Static or Rescue :: Controller :: Dynamic`)。 调用rescue_controller方法。 声明xxx_params方法。 (请参见Rails 4 / Strong Parameters) 简单的CRUD动作 ...

    撬动救援:每当出现问题时就启动撬动会话

    pry-rescue是Ruby的“未处理异常中断”的实现。 每当引发异常但无法挽救异常时,撬动救援将自动为您打开撬动: $ rescue examples / example2 . rb From : /home/conrad / 0 / ruby / pry - rescue / examples / ...

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

    单个异常使用 fail 关键字仅仅当捕获一个异常并且反复抛出这个异常(因为这里你不是失败,而是准确的并且故意抛出一个异常)。 begin fail 'Oops' rescue => error raise if error.message != 'Oops' end  ...

    graphql-errors:GraphQL Ruby的简单错误处理程序

    由祖先捕获异常,例如CustomError和rescue_from StandardError 。 每个架构配置。 没有依赖关系。用法定义GraphQL模式后: Schema = GraphQL :: Schema . define do query QueryTypeend 您可以使用G

    初步了解一下什么是ruby

     检查类型 条件语句 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 对像...

    net_http_exception_fix:加网

    :HTTP.get_response(uri)rescue Net::HTTPBroken => e ...end由于 对Tammer Saleh [1]和Stack Overflow [2]上所有发现的人的疯狂支持,证实了我在处理Net :: HTTP异常方面的正确性。 1个 2个运行测试 使用运行测试$...

    grape-on-rack:安装在RACK上的演示Grape API

    :一个返回JSON文档的世界示例 :一个简单的POST和PUT示例 :显示JSON数据的POST的示例 :预处理作为JSON数据发送的参数的示例 :的一个例子rescue_from其包装在一个HTTP错误代码500的所有异常 :使用基于路径的...

    appdev-chapters

    漂浮日期大批如果陈述循环每个杂凑我们自己的班级使用begin / rescue / end处理异常在Gitpod上安全地存储凭据气象学家(API简介) 发送电子邮件和短信Google翻译API API资源Ruby中的可选语法添加路线使用动态路由...

Global site tag (gtag.js) - Google Analytics