Мне было интересно, смогут ли люди поделиться своими передовыми методами/стратегиями по обработке исключений и ошибок. Теперь я не прошу, когда нужно исключать исключение (здесь было сказано: SO: Когда нужно выбросить исключение). И я не использую это для потока приложений, но есть законные исключения, которые происходят все время. Например, самым популярным будет ActiveRecord:: RecordNotFound. Какой был бы лучший способ справиться с этим? Сухой способ?
Сейчас я делаю много проверки внутри своего контроллера, поэтому, если Post.find(5)
возвращает Nil - я проверяю это и высылаю флеш-сообщение. Однако, хотя это очень гранулировано - это немного громоздко в некотором смысле, что мне нужно проверять такие исключения на каждом контроллере, в то время как большинство из них по существу одинаковы и связаны с записью, не найденной или связанной с ней, не найденной - такой поскольку либо Post.find(5)
не найден, либо если вы пытаетесь отображать комментарии, связанные с сообщением, который не существует, это приведет к исключению (что-то вроде Post.find(5).comments[0].created_at
)
Я знаю, что вы можете сделать что-то подобное в ApplicationController и перезаписать его позже в конкретном контроллере/методе, чтобы получить более подробную поддержку, однако это было бы правильным способом сделать это?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordInvalid do |exception|
render :action => (exception.record.new_record? ? :new : :edit)
end
end
И это будет работать в случае, если Post.find(5)
не найден, но как насчет Post.find(5).comments[0].created_at
- я имел в виду, что я не могу выкинуть исключение с полным исключением, если сообщение существует, но не имеет комментариев, правильно?
Подводя итог, я делал много ручной проверки, используя if/else/if или case/when (и я иногда припоминаю начало/спасение) и проверку на нуль? или пустой?, и т.д., но там должен быть лучший способ.
ОТВЕТЫ:
@Milan: Привет Милан Спасибо за ответ. Я согласен с тем, что вы сказали, и я думаю, что неправильно использовал слово исключение. Я имел в виду, что сейчас я делаю много вещей, таких как:
if Post.exists?(params[:post_id])
@p = Post.find(params[:post_id])
else
flash[:error] = " Can't find Blog Post"
end
И я делаю много такого "обработки исключений", я стараюсь избегать использования start/rescue. Но мне кажется, что это достаточно общий результат/проверка/ситуация, что должен быть DRYER-способ сделать это, не так ли? Как бы вы делали такую проверку?
И как бы справиться с этим в этом случае? Предположим, вы хотите отобразить дату создания комментария в своем представлении:
Last comment for this post at : <%= @post.comments[0].created_at %>
И этот пост не имеет комментариев. Вы можете сделать
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
Вы можете проверить контроллер. И т.д. Есть несколько способов сделать это. Но что такое "лучший" способ справиться с этим?