2016-08-14 42 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來處理這種事情。