【问题标题】:Ruby Style Guide and logging of messagesRuby 样式指南和消息记录
【发布时间】:2016-08-14 08:35:52
【问题描述】:

我正在开发一个可能会出现很多错误的应用程序。所以我 - 以及将使用这个应用程序的管理员 - 对记录所有相关信息非常感兴趣。但我正在为 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

在风格指南中记录错误是否有技巧或常见模式?还是在这种情况下我必须忽略样式指南?

【问题讨论】:

  • 我不清楚你在问什么。无法了解记录器或错误显示与 ruby​​ 样式指南的关系。
  • 对于上面的例子,你会得到警告,“Logger”的行太长,“do_something”方法有很多行代码。
  • 行数太多?那么多少行是正常的呢? 80 char?你知道为什么吗?为什么不将 toolong 行分成两个单独的行?这里有什么问题?我从不使用rubocop,抱歉,这很愚蠢,我更喜欢考虑代码和逻辑,而不是符号和字符串大小。海事组织

标签: ruby rubocop ruby-style-guide


【解决方案1】:

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

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 来处理这类事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多