我正在开发一个可能发生很多错误的应用程序。因此,我 - 以及将使用此应用程序的管理员 - 对记录所有相关信息非常感兴趣。但我正在努力与红宝石风格指南。 在大多数情况下,我喜欢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错误是否有技巧或常见模式?或者在这种情况下我是否必须忽略样式指南?
答案 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来处理这类事情。