Tag: 救援

Rescue_from不会从视图或帮助程序中解救Timeout :: Error

我的应用程序控制器中有一个around_filter来封装超时块中的所有操作,以便在达到30秒Heroku限制之前操作失败。 我还有一个来自Timeout :: Error的rescue_来干净地拯救这些超时。 不幸的是,rescue_from只在某些时候起作用。 如果在控制器内执行时发生超时,它可以正常工作,但如果超时发生在视图或帮助器中则无法解决。 Interout :: Errorinheritance的Interrupt和SignalException都没有正确地进行救援。 但是,抢救Exception本身确实可以在视图和帮助程序中正确地进行救援。 around_filter :timeout rescue_from Timeout::Error, :with => :timeout_rescue def timeout Timeout::timeout(10){ yield } end def timeout_rescue # Rescued end 有没有其他方法来拯救Timeout :: Error让这个工作?

当找不到id时,整个控制器的一般救援 – RoR

我偶然发现了我的应用程序查找数据库中不存在的id的情况。 抛出exception。 当然,对于任何Web开发人员来说,这都是一个非常标准的情况。 感谢这个答案,我知道使用救援处理的情况非常整齐,如下: def show @customer = Customer.find(params[:id]) rescue ActiveRecord::RecordNotFound #customer with that id cannot be found redirect_to action: :index #redirect to index page takes place instead of crashing end 如果找不到客户,则用户被重定向到索引页面。 这绝对没问题。 现在,这一切都很好,但我需要在show,edit,destroy等操作中进行相同的救援尝试,即每个需要特定id的控制器方法。 话虽如此, 这是我的问题:没有任何方法可以告诉我的控制器,如果它无法在任何方法中找到id,它将重定向到索引页面(或者,通常,执行特定的任务)?

替代“救援exception”

我偶尔会遇到一些意外错误,例如超时错误,503错误等。有些错误我甚至不知道我可能收到的错误。 做以下事情我无法解释所有这些: rescue Timeout::Error => e 拯救Exception也是一个可怕的想法。 我可以使用哪种替代方案? 当出现错误时,我希望我的代码能够拯救所有这些代码; 如果没有错误,我需要避免它。 我希望能够杀死我的脚本但不会跳过语法错误等。

为什么这种救援语法有效?

好的,所以我有一个我正在使用的应用程序的方法,它在生产中工作。 我的问题为什么这有效? 这是新的Ruby语法吗? def edit load_elements(current_user) unless current_user.role?(:admin) respond_to do |format| format.json { render :json => @user } format.xml { render :xml => @user } format.html end rescue ActiveRecord::RecordNotFound respond_to_not_found(:json, :xml, :html) end

Ruby忽略了救援ArgumentError

当我运行以下命令时,ArgumentError似乎忽略了rescue。 来自Ruby的ArgumentError错误消息出现在控制台上,但我的puts消息却没有。 我尝试使用TypeError和ZeroDivisionError进行救援,但它确实有效。 def divide(a, b) begin a.to_s + ‘ divided by ‘ + b.to_s + ‘ is ‘ + (a/b).to_s rescue ArgumentError puts ‘there must be two arguments’ end end divide(4)

Ruby救援声明是否适用于require?

Ruby rescue语句修饰符是否适用于require ? irb(main):001:0> require ‘a’ rescue nil LoadError: no such file to load — a from (irb):1:in `require’ from (irb):1 from :0

救援超时:: 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 Timeout :: timeout不会触发Exception,也不会返回记录的内容

我有这段代码: begin complete_results = Timeout.timeout(4) do results = platform.search(artist, album_name) end rescue Timeout::Error puts ‘Print me something please’ end 然后我启动包含此代码的方法,以及这里是堆栈跟踪的开始: exception消息:执行已过期 exception回溯:/*** /ย/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i 所以我天真地认为我的通话时间已经过去了。 但是“打印我喜欢的东西”永远不会被打印出来,而且假设是超时状态返回值(无论是真还是假,如文档中提到的那样),完全不是布尔值。 难道我做错了什么?

如何处理不知道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代码,但不知怎的,它设法仍然崩溃。 代码块看起来像这样: # 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相同。 是否有任何理由为什么开始 – 救援不会抓住这个例外?