2016-08-14 101 views
0

我正在开发一个应用程序,其中可能会出现很多错误。所以我 - 以及使用这个应用程序的管理员 - 对记录所有相关信息很感兴趣。但我正在努力与红宝石风格指南。 我爱大多数情况下rubocop默认和正常代码适合。但是使用日志记录,与普通应用程序相比,必须有更多的代码行。Ruby风格指南和消息记录

例如,参照此构建

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

目前还不清楚你问什么。无法获取记录器或错误显示如何与ruby样式指南相关。 –

+0

对于上面的例子,你会得到警告,“记录器”的行太长,并且“do_something”方法需要很多行代码。 – PascalTurbo

+0

线路太多?那么多少行是正常的? [80个字符](https://github.com/bbatsov/rubocop/blob/master/config/default.yml#L547)?你知道为什么吗?为什么不把_too long_ line分成两行?这里有什么问题?我从不使用'rubocop',抱歉,但它很愚蠢,我更喜欢考虑代码和逻辑,而不是关于符号和字符串大小。 IMO –

回答

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