LINUX.ORG.RU

Способ поднять уровень?

 


0

1

Проще всего показать на коде:

...
Timeout::timeout(RESOURCE_CONTENT_PROBE_TIMEOUT) do
  begin
    body = http.get(@resource.path, { "User-Agent" => UA }).body
    body = convert_to_utf8(body)
    true
  rescue
    false
  end
end
...

def convert_to_utf8(body)
  begin
    charset = CharDet.detect(body, silent: false).encoding
    body = body.encode('utf-8', charset) unless charset == 'utf-8'
  rescue
  end
  body
end

Мне кажется что я должен был бы писать в лог об ошибках в блоке rescue-end. Ещё кажется что два раза begin-end - это лишнее. В Programming Ruby этот вопрос не разъясняется. Но мне хочется знать точно как писать это лучше.


Ещё кажется что два раза begin-end - это лишнее

У тебя не 2 раза begin-end, begin-end внутри do-end. Убери вложенный begin-end и убедись, что будет синтаксическая ошибка.

А вот в блоке def-end можно использовать rescue и ensure без вложенного begin. Т.е. в твоём втором примере если бы у тебя не было вызова body, ты мог бы убрать begin-end.

geekless ★★
()
Ответ на: комментарий от geekless

Речь не о том, как заставить это работать. Сам писал, знаю как работает :)

Чёрт, даже не знаю как выразить... код из функции можно было бы не выносить, но обычно рекомендуется так делать. А раз выношу, то удобно обернуть в begin-end. Можно было не выносить. Можно было не оборачивать. Можно было вместо исключений использовать false/nil.

А чего бы прочесть чтоб понимать как лучше?

daris
() автор топика
Ответ на: комментарий от daris

1. convert_to_utf8() — это отдельный алгоритм, логично его оформить отдельной функцией.

2. Не вижу смысла ловить исключение внутри convert_to_utf8(). Впрочем, это зависит от принятого в проекте способа обработки исключений. Можно в си-стиле писать всё на if-ах, проверяя возвращаемые значения. Можно кидать исключения. Главное, чтобы единообразно. Принципиальной разницы нет никакой, это только сахар. Поскольку в Руби уже по факту используется второй способ, имеет смысл его и придерживаться.

3. Вообще я не понял, что ты делаешь в этом коде: зачем строка body = convert_to_utf8(body) без сайд эффектов?

geekless ★★
()
Ответ на: комментарий от geekless

Вообще я не понял, что ты делаешь в этом коде: зачем строка body = convert_to_utf8(body) без сайд эффектов?

Это недописанный код.

Не вижу смысла ловить исключение внутри convert_to_utf8().

Я попросил функцию сыпать исключения (silent...) чтобы явно знать отработала ли она. Это короче чем проверка на nil.

Впрочем, это зависит от принятого в проекте способа обработки исключений. Можно в си-стиле писать всё на if-ах, проверяя возвращаемые значения. Можно кидать исключения. Главное, чтобы единообразно. Принципиальной разницы нет никакой, это только сахар. Поскольку в Руби уже по факту используется второй способ, имеет смысл его и придерживаться.

Всё это у меня идёт из чувства прекрасного, основывающегося на скудном опыте. Мне нужно больше данных о хорошем стиле. Его всяко придумали люди поумнее и поопытнее.

daris
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.