Tag: error handling

如何在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,然后重新尝试插入它。 救援区怎么样?

我们为什么要避免使用其修饰forms的救援?

我会定义价值。 但是这个值可能是hash的键值。 如果此键不存在,我将使用rescue定义值为nil。 例如 foo = bar[:a][:b][:c] rescue nil 但在实践中告诉我糟糕的风格,因为我使用其修饰forms的救援。 我将改变逻辑以使用检查三个条件。 foo = bar[:a][:b][:c] if bar.key?(:a) && bar[:a].key?(:b) && bar[:a][:b].key?(:c) 我真的很想知道为什么我们要避免在rails中使用其修改器forms的救援?

在查看Sinatra表单时,为什么会收到“Errno :: ENOENT:没有这样的文件或目录”?

我正在尝试按照本教程: http://net.tutsplus.com/tutorials/ruby/singing-with-sinatra/ 陷入困境“我们还将使用” 视图文件 “,它允许我们将视图的标记拆分为单独的文件。” 我的basics.rb文件运行正常。 我的文件存储如下: Desktop/RubyForm/basics.rb Desktop/RubyForm/view/form.erb 但是,现在当我去http://localhost:9393/form ,我受到了欢迎: Errno::EIO at /form Input/output error – file: lint.rb location: write line: 398 sinatra.error Errno::ENOENT: No such file or directory – /Users/HelenasMac/Desktop/views/form.erb UPDATE! : 运行ruby basics.rb并转到http://localhost:4567/form 。 但是,在我运行“shotgun basics.rb”之后,我必须转到http://localhost:9393/form ,这就是表单没有显示的时候。 我究竟做错了什么? 免责声明:巨型初学者使用ruby并使用终端。 提前致谢!

UTF-8中的字节序列无效(ArgumentError)

我正在尝试运行Ruby脚本,并且总是在这一行上出错: file_content.gsub(/dr/i,’med’) 我试图用“med”代替“dr”。 错误是: program.rb:4:in `gsub’: invalid byte sequence in UTF-8 (ArgumentError) 为什么,我该如何解决这个问题呢? 我正在使用Ruby 2.2.1p85开发MAC OS X Yosemite机器。

如果远程URL没有返回/超时问题,使用Open-URI获取XML和最佳实践?

只要没有远程错误,当前代码就可以工作: def get_name_from_remote_url cstr = “http://someurl.com” getresult = open(cstr, “UserAgent” => “Ruby-OpenURI”).read doc = Nokogiri::XML(getresult) my_data = doc.xpath(“/session/name”).text # => ‘Fred’ or ‘Sam’ etc return my_data end 但是,如果远程URL超时或什么都不返回怎么办? 例如,我如何检测到并返回nil? 而且,Open-URI是否提供了一种方法来定义在放弃之前等待多长时间? 当用户等待响应时调用此方法,那么我们如何在放弃之前设置最大timeoput时间并告诉用户“抱歉我们尝试访问的远程服务器现在不可用”?

开始救援没有捕获错误

我正在使用一些包含在开始 – 救援块中的ruby代码,但不知怎的,它设法仍然崩溃。 代码块看起来像这样: # Retrieve messages from server def get_messages @connection.select(‘INBOX’) @connection.uid_search([‘ALL’]).each do |uid| msg = @connection.uid_fetch(uid,’RFC822′).first.attr[‘RFC822’] begin process_message(msg) add_to_processed_folder(uid) if @processed_folder rescue handle_bogus_message(msg) end # Mark message as deleted @connection.uid_store(uid, “+FLAGS”, [:Seen, :Deleted]) end end 鉴于此代码,我假设如果process_message或add_to_processed_folder无法执行,那么rescue将启动并调用handle_bogus_message 。 话虽如此,我在生产环境中运行此代码,有时当我“获取”电子邮件消息(这是从rake任务运行)时,它会死于SyntaxError 。 要查看错误消息,请查看http://pastie.org/1028479,而不是它所引用的process_message与上面的process_message相同。 是否有任何理由为什么开始 – 救援不会抓住这个例外?

在OSX上使用RVM安装任何ruby版本时出错

伙计我要用这个来杀死自己! 我在RVM安装多个版本的Ruby时遇到了一些问题,并且在Stackoverflow上跟随一个线程后我决定完全删除它。 重新安装RVM后,我根本无法安装任何Ruby版本。 Mac OS X. RVM 1.20.10稳定 自制语0.9.4 这是一些日志: rvm install 2.0.0-p0 要么: rvm install 2.0.0-p195 –autolibs = enabled Searching for binary rubies, this might take some time. No binary rubies available for: osx/10.8/x86_64/ruby-2.0.0-p0. Continuing with compilation. Please read ‘rvm mount’ to get more information on binary rubies. Installing requirements for osx, might require […]

使用simple_form自定义错误消息

我正在使用simple_form gem。 我想自定义用户validation失败时显示的错误消息。 我怎么能做到这一点?