我正在开发一个可能发生很多错误的应用程序。因此,我——以及使用此应用程序的管理员——对记录所有相关信息非常感兴趣。但是我在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来处理这类事情。