Rails에서 다른 Rails 예외처럼 작동하도록 어떻게 예외를 발생 시키나요?


91

일반 Rails 예외와 동일한 작업을 수행하도록 예외를 발생시키고 싶습니다. 특히 개발 모드에서는 예외 및 스택 추적을 표시하고 프로덕션 모드에서는 "죄송합니다. 문제가 발생했습니다."페이지를 표시합니다.

다음을 시도했습니다.

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

그러나 단순히 "ERROR signing up, group missing!"development.log 파일에 기록 합니다.


2
게시 한 오류 메시지가이 예외에서 비롯된 것 같지 않습니다 (다른 메시지입니다). 이것이 실제로보고있는 것입니까?
levinalex 2009

답변:


139

특별한 조치를 취할 필요는 없습니다.

이 컨트롤러가있는 새로운 레일 앱이있는 경우 :

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

그리고 이동 http://127.0.0.1:3000/foo/

스택 추적에서 예외가 표시됩니다.

Rails (2.3 이후) 는 프레임 워크 자체에서 가져온 스택 추적에서 행을 필터링 하기 때문에 콘솔 로그에 전체 스택 추적이 표시되지 않을 수 있습니다 .

참조 config/initializers/backtrace_silencers.rb레일스 프로젝트에


2
훌륭하고 간결한 답변입니다.
rcd

1
skitch 링크 (스택 추적에서 예외 확인)가 더 이상 작동하지 않음
Asaf

@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

여기서 수행하는 작업은 예외 역할을하는 "NotActivated"클래스를 만드는 것입니다. raise를 사용하면 "NotActivated"를 예외로 던질 수 있습니다. rescue_from은 지정된 메소드 (이 경우 not_activated)로 예외를 포착하는 방법입니다. 꽤 긴 예이지만 어떻게 작동하는지 보여줄 것입니다.

최고의 소원,
Fabian


이것은 개발 모드에서 예외 및 스택 추적을 표시하지 않고 프로덕션 모드에서 "죄송합니다. 문제가 발생했습니다"페이지를 표시합니다.
Chirag Patel

2
"죄송합니다"페이지는 실제로 웹 서버의 500 오류 처리기입니다. .htaccess 파일을 확인하면 보통 거기에서 볼 수 있습니다
Jeff Paquette 2009-12-17

OP에 대한 답변은 아니지만 매우 유용한 예입니다. 감사합니다!
Neil Stockbridge

11

더 쉬운 방법이 필요하고 많은 소란을 원하지 않는 경우 간단한 실행은 다음과 같습니다.

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

이 예외가 발생합니다, 말 ee.message = something bad happened!

일반적으로 다른 모든 예외를 구할 때 구출 할 수 있습니다.


'예외'자체를 발생 시키거나 구하는 것은 좋지 않습니다. 대신 StandardError를 사용해보십시오. 자세한 내용은 다음을 참조하십시오. stackoverflow.com/questions/10048173/…
Ekamjit Singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.