2016-08-14 5 views
0

Я разрабатываю приложение, в котором может возникнуть множество ошибок. Поэтому я - и администраторы, которые будут использовать это приложение, - очень заинтересованы в регистрации всей релевантной информации. Но я борюсь с рубиновыми гидами. Мне нравятся дефолты rubocop и нормальный код в большинстве случаев. Но с протоколированием там должно быть намного больше строк кода, чем в обычном приложении.Руководство по Ruby Style и ведение журнала сообщений

Для примера см этой конструкции

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 

Есть ли трюк или общий шаблон для ошибок регистрации Сечи в стиле руководстве соответствует пути? Или я должен игнорировать руководство по стилю в этом случае?

+0

Непонятно, для чего вы спрашиваете. Невозможно узнать, как отображение журнала или ошибок относится к руководствам стиля рубинов. –

+0

В приведенном выше примере вы получите предупреждения о том, что строки с «Logger» слишком длинны и что метод «do_something» имеет много строк кода. – PascalTurbo

+0

Слишком много строк? Итак, сколько строк нормально? [80 char] (https://github.com/bbatsov/rubocop/blob/master/config/default.yml#L547)? Ты знаешь почему? Почему бы не разделить строку _too long_ на две отдельные строки? В чем проблема? Я никогда не использую '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 для обработки такого рода вещей.

 Смежные вопросы

  • Нет связанных вопросов^_^