Tag: exception

救援超时:: Redis Gem(Ruby)出错

我需要拯救从Redis库中引发的Timeout::Error但是我遇到了一个问题,抢救那个特定的类似乎不起作用。 begin Redis.new( { :host => “127.0.0.X” } ) rescue Timeout::Error => ex end => Timeout::Error: Timeout::Error from /Users/me/.rvm/gems/ree-1.8.7-2011.03@gowalla/gems/redis-2.2.0/lib/redis/connection/hiredis.rb:23:in `connect’ 当我试图拯救Exception它仍然无效 begin Redis.new( { :host => “127.0.0.X” } ) rescue Exception => ex end => Timeout::Error: Timeout::Error from /Users/me/.rvm/gems/ree-1.8.7-2011.03@gowalla/gems/redis-2.2.0/lib/redis/connection/hiredis.rb:23:in `connect’ 如果我尝试手动提升exception,我可以拯救它,但不知道为什么我从Redis Gem(2.2.0)中调用它时无法解救它。 begin raise Timeout::Error rescue Timeout::Error => ex puts ex end Timeout::Error => nil […]

如何在ruby回溯中获取源和变量值?

这是典型的Ruby on Rails回溯的最后几帧: 应用程序跟踪http://img444.imageshack.us/img444/8990/rails-lastfew.png 以下是Python中典型的Nevow追溯的最后几帧: 替代文字http://img444.imageshack.us/img444/9173/nw-lastfew.png 它不仅仅是网络环境,你可以在ipython和irb之间进行类似的比较。 如何在Ruby中获得更多这类细节?

如何处理不知道Ruby中的库方法可以引发什么exception?

这是一个广泛的问题,但在Ruby编程时我会继续遇到这个问题。 我来自一个很大程度上是C和Java的背景,当我使用库函数或方法时,我会查看文档并查看错误返回的内容(通常在C中)或者它可以抛出的exception(在Java中)。 在Ruby中,情况似乎完全不同。 刚才我需要解析从服务器收到的一些JSON: data = JSON.parse(response) 当然,在编写这段代码后我想到的第一件事就是如果输入不好怎么办? parse是否会在出错时返回nil,或者引发一些exception,如果是,那么哪些? 我查看文档( http://flori.github.com/json/doc/JSON.html#M000022 ),看看,简单地说: “将JSON字符串源解析为Ruby数据结构并将其返回。” 这只是我在Ruby中反复遇到的模式的一个例子。 最初,我认为这是我正在使用的任何库的文档的一些缺点,但现在我开始觉得这是标准的做法,我的思维方式与Ruby程序员有些不同。 有一些我不知道的惯例吗? 开发商如何处理这个问题? (是的,我确实查看了库方法的代码,并且可以了解引发了哪些exception,但我不能100%确定,如果没有记录,我会感到不舒服,依赖它。) 编辑 :看完前两个答案后,让我继续上面的JSON解析示例。 我怀疑我不应该这样做: begin data = JSON.parse(response) raise “parse error” if data.nil? rescue Exception => e # blahblah end 因为我可以查看代码/测试并看到它似乎引发错误的ParserError (返回nil似乎不是Ruby中的标准做法)。 我是否正确地说建议的做法是: begin data = JSON.parse(response) rescue JSON::ParserError => e # blahblah end …基于我通过查看代码和测试了解ParserError的内容? (我还编辑了示例以澄清它是我正在解析的服务器的响应。)

在ruby中使用正确的exception子类

我可以访问ruby的exception层次结构(它在pickaxe和蜂鸟中都有提到),但是我不确定使用哪个例外,因为我没有找到任何关于每个术语含义的信息。 使用正确的exception类是否重要?

Ruby中的失败与提升:我们真的应该相信风格指南吗?

Ruby提供了两种以编程方式引发exception的可能性: raise和fail ,两者都是Kernel方法。 根据文件,它们绝对相同。 出于习惯,我到目前为止只使用了raise 。 现在我找到了一些建议(例如这里 ),使用raise来捕获exception,并且对于不应该处理的严重错误而fail 。 但它真的有意义吗? 当你编写一个类或模块,并导致内部问题,你发出错误信号时,正在审查代码的编程同事可能会很高兴地理解你的意图,但使用我的代码的人很可能看不到在我的代码中无法知道exception是由raise还是由fail引起的。 因此,我谨慎使用raise或fail不会对他的决定产生任何影响,无论她是否应该处理。 有人会在我的论点中看到缺陷吗? 或者是否有其他标准,我可能想要使用fail而不是raise ?

什么可能导致这个铁路ioerror封闭流?

我有一个rails应用程序,在开发模式下运行(带有sqlite数据库)。 该应用程序的目的是允许用户通过Java客户端上载文件。 如果用户想要上传文件夹,则会以递归方式上传其中的所有文件。 如果用户想要上传文件,则文件将正常上传。 这是我收到的错误: IOError in UploadedFilesController#new closed stream 这是应用程序跟踪: /usr/lib/ruby/1.8/tempfile.rb:167:in `close’ /usr/lib/ruby/1.8/tempfile.rb:167:in `callback’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/vendor/builder-2.1.2/blankslate.rb:85:in `call’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/vendor/builder-2.1.2/blankslate.rb:85:in `method_added’ app/controllers/uploaded_files_controller.rb:114 /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in `load_without_new_constant_marking’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in `load_file’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:202:in `load_file’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:94:in `require_or_load’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:248:in `load_missing_constant’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:453:in `const_missing’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:465:in `const_missing’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/inflector.rb:257:in `constantize’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/inflections.rb:148:in `constantize’ /var/lib/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/routing.rb:1426:in `recognize’ /var/lib/gems/1.8/gems/rails-2.0.2/lib/webrick_server.rb:78:in `service’ /var/lib/gems/1.8/gems/rails-2.0.2/lib/commands/servers/webrick.rb:66 /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in’ /var/lib/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require’ /var/lib/gems/1.8/gems/rails-2.0.2/lib/commands/server.rb:39 这是框架跟踪: /usr/lib/ruby/1.8/tempfile.rb:167:in `close’ […]

delayed_job的exception_notification

对于delayed_job,是否有类似exception_notification的gem? 最好与REE-1.8.7和Rails 2.3.10一起使用。

有没有办法在exception时启动Ruby调试器?

有没有办法在代码抛出exception时启动/ Ruby调试器,而不是像这样包装代码: begin #do something rescue debugger end 我想以这样的方式使用它,如果do something部分引发exception,调试器将启动。 不必修改代码就可以全部添加开始救援块。

在Ruby中重新分配常量时抛出exception?

我早就意识到Ruby中的“常量”(即大写的变量名)并不是真正的常量。 与其他编程语言一样,对象的引用是唯一存储在变量/常量中的东西。 (补充工具栏:Ruby确实具有“冻结”被修改引用对象的function,据我所知,这不是许多其他语言提供的能力。) 所以这是我的问题:当你为一个常量重新赋值时,你得到一个警告: >> FOO = ‘bar’ => “bar” >> FOO = ‘baz’ (irb):2: warning: already initialized constant FOO => “baz” 有没有办法强制Ruby抛出exception而不是打印警告? 很难弄清楚为什么有时会进行重新分配。