Ruby样式指南和消息记录

时间:2016-08-14 08:35:52

标签: ruby rubocop ruby-style-guide

我正在开发一个可能发生很多错误的应用程序。因此,我 - 以及将使用此应用程序的管理员 - 对记录所有相关信息非常感兴趣。但我正在努力与红宝石风格指南。 在大多数情况下,我喜欢rubocop默认值和normaly代码。但是对于日志记录,必须有比正常应用程序更多的代码行。

例如,请参阅此构造

def do_something
  client.connect
  rescue FirstErrorType => e
    Logger.warn('Client') { "This is an error message for my Client: '#{e}'" }
    sleep 10
    retry
  rescue SecondErrorType => e
    Logger.warn('Client') {"This is an other error message for my Client: '#{e}'" }
    sleep 5
    retry
  rescue ThirdErrorType => e
    Logger.warn('Client') {"And even a third error message for my Client: '#{e}' "}
    sleep 30
    retry
  end
end

在样式指南符合方式中记录sich错误是否有技巧或常见模式?或者在这种情况下我是否必须忽略样式指南?

1 个答案:

答案 0 :(得分:0)

这里有很多重复,这可能是你问题的原因。您可能想要做的是定义映射表:

HANDLERS = {
  FirstErrorType => {
    level: :warn,
    scope: 'Client',
    message: "This is an error message for my Client",
    delay: 10
  },
  SecondErrorType => {
    level: :warn,
    scope: 'Client',
    message: "This is an other error message for my Client",
    delay: 5
  },
  ThirdErrorType => {
    level: :warn,
    scope: 'Client',
    message: "This is an other error message for my Client",
    delay: 30
  }
}

然后你可以使用这个映射表从任意错误中恢复,你可以在这里只编写一次一次的实际机制:

def do_something
  client.connect

rescue => e
  if (hander = HANDLERS[e.class])
    Logger.send(handler[:level], handler[:scope]) do
      '%s: %s' % [ handler[:message], e.to_s ]
    end

    sleep(handler[:delay])

    retry
  else
    raise e
  end
end

更强大的版本会使用Rails rescue_from method风格的元编程,你可以使用一个小型DSL来处理这类事情。