Ruby风格指南和消息日志



我正在开发一个可能发生很多错误的应用程序。因此,我——以及使用此应用程序的管理员——对记录所有相关信息非常感兴趣。但是我在ruby风格指南方面遇到了困难。我喜欢rubocop的默认设置,大多数情况下代码都很合适。但是有了日志记录,就会有比普通应用程序更多的代码行。

例如

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

是否有一种技巧或一种通用的模式来记录这种符合风格指南的错误?或者在这种情况下我必须忽略样式指南吗?

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

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方法风格的元编程,其中你有一个小的DSL来处理这类事情。

最新更新