【问题标题】:Make Ruby/Rails continue method after encountering error遇到错误后使 Ruby/Rails 继续方法
【发布时间】:2011-08-09 02:30:48
【问题描述】:
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 给出错误)时,此方法会崩溃,并且不会继续检查其余的域。有什么办法可以让它继续检查其余的域,即使它崩溃了?至少在我能够整理出每个域名之前。

【问题讨论】:

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


    【解决方案1】:
      @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
    

    【讨论】:

      【解决方案2】:

      当你说

      崩溃

      我假设您的意思是您遇到了异常。如果是这种情况,那么只需捕获异常,用它做你想做的事情(将地址存储在 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
      

      如果您指的是其他东西,比如整个应用程序正在死去,那么我没有任何线索,也没有足够的信息来提供进一步的建议。对不起

      【讨论】:

      • 我不知道我会为救援做些什么,我只是希望它继续进入下一个域。
      • 你可以为所欲为,也可以什么都不做。将错误的电子邮件地址存储在 bad_email 表中以便您下次可以更轻松地过滤掉它们似乎是一件足够合理的事情。我会更新我的答案
      • 您可以将next 用于救援。这告诉迭代转到下一个项目。但是由于您在迭代中具有 begin-rescue-end,因此在救援中放置任何内容也可以。
      • @mischa - 感谢您指出这一点,我完全忽略了使用 next
      【解决方案3】:

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

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

      【讨论】:

      • 是的,我添加了格式验证。但是仍然有无效的 tld 之类的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多