Tag: exception处理

如何在ruby中处理mongodb的E11000重复键错误

有没有在ruby中处理mongodb相关exception的好例子? 在这种情况下,我有: /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/networking.rb:89:in `send_message_with_gle’: 11000: E11000 duplicate key error index: somedb.somecoll.$_id_ dup key: { : “some_id” } (Mongo::OperationFailure) from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:1108:in `block in insert_documents’ from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:33:in `block in instrument’ from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:65:in `instrument’ from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/util/logging.rb:32:in `instrument’ from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:1106:in `insert_documents’ from /home/askar/.rvm/gems/ruby-1.9.3-p429/gems/mongo-1.8.6/lib/mongo/collection.rb:375:in `insert’ from lib/tasks/getorders.rb:47:in `block in ‘ from lib/tasks/getorders.rb:25:in `each’ from lib/tasks/getorders.rb:25:in `’ 我有这个错误,因为我正在尝试插入一个已存在于mongodb数据库中的id的文档,我只是想知道如何在ruby中处理mongodb相关的exception。 例如,如果发生exception,那么我将更改散列的id,然后重新尝试插入它。 救援区怎么样?

如何从模型回调中捕获在不同线程上引发的rsolr Sunspotexception?

即使我可以捕获从@ post.save引发的exception并记录错误并打印线程 begin if @post.save rescue Exception => ex # rescue Errno::ECONNREFUSED => ex Thread.list.each {|t| pt} Rails.logger.error “ERROR: Could not save blog post! Is the Solr server up and running? Exception: #{ex}” 它仍然在网页上出错,并且不会在堆栈跟踪中显示我的任何代码。 solr Sunspot模型回调在一个单独的线程上运行。 rsolr (1.0.9) lib/rsolr/connection.rb:19:in `rescue in execute’ rsolr (1.0.9) lib/rsolr/connection.rb:14:in `execute’ … sunspot_rails (2.1.0) lib/sunspot/rails/solr_instrumentation.rb:15:in `send_and_receive_with_as_instrumentation’ (eval):2:in `post’ rsolr (1.0.9) […]

无法解救YAML.loadexception

我正在尝试处理在Ruby中加载无效的YAML数据,但似乎无法挽救心理引发的exception。 这是一些示例代码,用于演示我遇到的问题: require ‘yaml’ begin YAML.load(‘&*%^*’) rescue puts “Rescued” end 例外: # ruby test.rb /usr/lib64/ruby/1.9.1/psych.rb:203:in `parse’: (): did not find expected alphabetic or numeric character while scanning an anchor at line 1 column 1 (Psych::SyntaxError) from /usr/lib64/ruby/1.9.1/psych.rb:203:in `parse_stream’ from /usr/lib64/ruby/1.9.1/psych.rb:151:in `parse’ from /usr/lib64/ruby/1.9.1/psych.rb:127:in `load’ from test.rb:3:in `’

Ruby – 执行过期

我有一个像这样的ruby代码: begin doc = Nokogiri::HTML(open(url).read.strip) rescue Exception => ex log.error “Error: #{ex}” end 我得到的日志是: ERROR — : Error: execution expired 我希望块重新执行直到成功。 我该怎么做?

救援超时:: 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脚本,每分钟打印出信息。 我还为陷阱设置了一个proc,这样当用户点击ctrl-c时,进程就会中止。 代码看起来像这样: switch = true Signal.trap(“SIGINT”) do switch = false end lastTime = Time.now while switch do if Time.now.min > lastTime.min then puts “A minute has gone by!” end end 现在代码本身是有效的并且运行良好,但它做了很多无用的工作,尽可能多地检查switch的值。 它占用了尽可能多的处理器(至少是一个核心的100%),所以它非常浪费。 我怎样才能做类似的事情,每隔一段时间更新一次事件,而不浪费大量的周期? 所有帮助表示赞赏,并提前致谢!

在Ruby中自动记录exception

是否有一个库或简单的方法来捕获Ruby程序中抛出的exception并将其记录到文件中? 我查看了log4r和logger ,但两者的文档都没有提供任何关于如何执行此操作的示例。 我远程运行该程序并丢失stdout和stderr的句柄,如果该信息有帮助的话。 你会推荐什么?

如何处理不知道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的内容? (我还编辑了示例以澄清它是我正在解析的服务器的响应。)

断言在Cucumber中抛出了一个特殊的exception

脚本 我正在写一个库(没有Ruby on Rails),我想要非常详细的Cucumberfunction。 这尤其包括描述在各种情况下应该抛出的错误/exception。 例 编写Cucumber步骤最直观的方法可能就是这样 When I do something unwanted Then an “ArgumentError” should be thrown 问题 我必须解决两个问题: 抛出exception时,第一步不应该失败。 第一步抛出的exception应该可以被第二步访问,以便做一些断言魔术。 不雅和繁琐的解决方案 我能够提出的最好方法是在第一步中缓存exception并将其放入第二步可以访问的实例变量中,如下所示: When /^I do something unwanted$/ do begin throw_an_exception! rescue => @error end end Then /^an “(.*)” should be thrown$/ do |error| @error.class.to_s.should == error end 但是,在我不希望它失败的情况下,这使得第一步或多或少无用,并且它需要一个实例变量,这绝不是一件好事。 那么,任何人都可以帮助我解决至少不那么麻烦的解决方案吗? 或者我应该以不同的方式编写我的function? 任何帮助将非常感激。

如何捕获EventMachine服务器上的顶级故障?

我有一个EventMachine服务器,我用monit监控。 有时会崩溃,我试图找出原因,但我不清楚如何记录所有顶级故障。 我试过这样的代码: begin EventMachine::run do EventMachine::start_server(‘0.0.0.0’, PORT, MyServer) end rescue Exception => e puts “FAILURE: #{e.class}: #{e}” end 但这似乎永远不会发现错误。 我怀疑它可能就像内存耗尽一样,我正在单独跟踪,但我仍然希望这台服务器在可能的情况下记录它的近似失败原因。