Я злоупотребляю "спасением" для нулевых проверок? - PullRequest
9 голосов
/ 17 сентября 2010

Я использую rescue для всего, а не только для "спасения" исключений. Я имею в виду, мне просто нравится, как это избавляет меня от проверки и двойной проверки данных.

Например, допустим, у меня есть модель Item, которая может иметь или не иметь User. Затем, когда я хочу получить имя владельца предмета, я пишу:

item.user.name rescue ""

вместо чего-то вроде

item.user.nil? ? "" : item.user.name

Это заставляет думать то же самое, поскольку nil.name вызывает исключение, которое я спасаю с помощью "", но я не уверен, что это хорошая практика. Это делает то, что я хочу, и делает это с меньшим количеством кода, но ... я не знаю, все эти rescue слова здесь и там заставляют меня чувствовать себя неуверенно.

Это плохая практика или допустимо злоупотребление ключевым словом rescue?

Ответы [ 4 ]

7 голосов
/ 17 сентября 2010

Я думаю, что вы немного злоупотребляете спасением, хотя в Rails есть специальный метод для этих проблем: try. Документация

В вашем случае item.user.try(:name) может быть более подходящим подходом.

3 голосов
/ 17 сентября 2010

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

1 голос
/ 18 сентября 2010

В качестве альтернативы вашему злоупотреблению rescue проверьте самоцвет и . Это похоже на try, предложенный другим, но более приятным. andand позволяет вам сказать:

item.user.andand.name

Выражение будет nil, если item.user равно nil.

1 голос
/ 17 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...