遇到错误后使Ruby / Rails继续方法

时间:2011-08-09 02:30:49

标签: ruby-on-rails ruby ruby-on-rails-3

def checkdomains
  @domains = Domain.all

  #@domains.where(:confirmed => "yes").each do |f|
  @domains.each do |f|
    r = Whois.whois(f.domain)
    if r.available? == true
      EmailNotify.notify_email(f).deliver
    end
  end
end

此方法在出现无效的url(whois gem出错)时崩溃,并且不会继续检查其余域。有什么方法可以让它继续检查其余的域,即使它崩溃了吗?至少在我能解决每个域名的问题之前。

3 个答案:

答案 0 :(得分:9)

  @domains.each do |f|
    begin
      r = Whois.whois(f.domain)
      if r.available? == true
        EmailNotify.notify_email(f).deliver
      end
    rescue Exception => e
      puts "Error #{e}"
      next   # <= This is what you were looking for
    end
  end

答案 1 :(得分:3)

当你说

  

崩溃

我认为你的意思是你得到了一个例外。如果是这种情况,那么只需捕获异常,用它做你想做的事情(将地址存储在bad_email表或其他任何内容中)然后继续做你正在做的事情。您的日志文件将告知正在引发的异常,以便您知道救援声明应该是什么

所以

begin
  r = Whois.whois(f.domain)
  if r.available? == true
  EmailNotify.notify_email(f).deliver
rescue WhateverException
  #do something here like re raise the error or store the email address in a bad_emails table or do both just simply do nothing at all
end

如果你指的是整个应用程序死亡之类的其他东西,那么我就没有线索,而且没有足够的信息可以进一步提供建议。遗憾

答案 2 :(得分:2)

正如jamesw建议的那样,您可以将语句包装在异常处理程序中,在它们发生时处理它们。让我进一步建议,无论您的程序获得这些(可能是无效的)域名,您只要获得它们就会对它们进行验证,然后抛弃无效的域名。这样,当你到达这个循环时,你已经知道你正在迭代一个好域名列表。

编辑:对于域名验证,请检查here