Як підняти виняток у Rails, щоб він поводився як інші винятки Rails?


91

Я хотів би викликати виняток, щоб він робив те саме, що робить звичайний виняток Rails. Спеціально покажіть виняток і стек стека в режимі розробки та покажіть сторінку "На жаль, але щось пішло не так" у виробничому режимі.

Я спробував наступне:

raise "safety_care group missing!" if group.nil?

Але він просто пише "ERROR signing up, group missing!"у файл development.log


2
повідомлення про помилку, яке ви опублікували, здається, не з цього винятку (це інше повідомлення), це насправді те, що ви бачите?
levinalex

Відповіді:


139

Не потрібно робити нічого особливого, це повинно просто працювати.

Коли у мене є нова програма reils з цим контролером:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

і перейти до http://127.0.0.1:3000/foo/

Я бачу виняток із трасуванням стека.

Можливо, ви не побачите весь стек у журналі консолі, оскільки Rails (починаючи з 2.3) фільтрує рядки із трасування стека, що надходять із самого фреймворку.

Дивіться config/initializers/backtrace_silencers.rbу своєму проекті Rails


2
Відмінна, стисла відповідь.
rcd

1
Посилання skitch (бачимо виняток із трасуванням стека) більше не працює
Асаф,

@levinalex чи буде це безпечно у виробничому режимі, щоб показати стек?
BKSpurgeon

@levinalex - дякую Алекс. чи є спосіб додати власний рядок до повідомлення про помилку?
BKSpurgeon

62

Ви можете зробити це так:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

Те, що ви тут робите, - це створення класу "Неактивовано", який буде винятком. Використовуючи рейз, ви можете кинути "Неактивований" як виняток. rescue_from - це спосіб вловити виняток із зазначеним методом (у цьому випадку не_активований). Досить довгий приклад, але він повинен показати вам, як це працює.

З найкращими побажаннями,
Фабіане


Це не відображає виняток і трасування стека в режимі розробки та відображає сторінку "На жаль, але щось пішло не так" у виробничому режимі.
Chirag Patel

2
Сторінка "ми шкодуємо" насправді є обробником помилок 500 вашого веб-сервера. Перевірте свій файл .htaccess, і ви, як правило, побачите його там
Джефф Пакет

Можливо, це не відповідь на ОП, але дуже корисний приклад, дякую!
Ніл Стокбрідж,

11

Якщо вам потрібен простіший спосіб зробити це, і ви не хочете зайвої суєти, просте виконання може бути:

raise Exception.new('something bad happened!')

Це призведе до винятку, скажімо eзe.message = something bad happened!

а потім ви можете врятувати це, коли рятуєте всі інші винятки загалом.


Це не гарна ідея підняти або врятувати сам "Виняток", спробуйте використовувати замість нього StandardError. Дивіться це докладно: stackoverflow.com/questions/10048173 / ...
Ekamjit Singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.