2014-09-09 2 views
0

레일 애플리케이션을 사용하고 있으며 일반적으로 서버 성능을 이해할 수 있도록 데이터베이스 공유 서버가 다운되었을 때 예외를 잡으려고합니다. 레일 데이터베이스 연결 예외를 캐치하는 방법

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :check_database 

    rescue_from Exception do |exception| 
    ExceptionNotifier::Notifier \ 
     .exception_notification(request.env, exception) \ 
     .deliver 
    raise exception 
    end 

    private 

    def check_database 
    Category.first 
    rescue Exception => exception 
    ExceptionNotifier::Notifier \ 
     .exception_notification(request.env, exception) \ 
     .deliver 
    raise exception 
    end 

end 

그러나, 구조 블록의 아무도 나를 위해 일한 :이를 위해, 내가 https://github.com/smartinez87/exception_notification에서 내와 ApplicationController에 exception_notification 보석을 설정, 나는 다음과 같은 코드가 있습니다. Rails에서 어떻게 이러한 예외를 잡을 수 있는지 조언 해 주실 수 있습니까? 감사합니다

+0

작동하지 않는다는 것이 무엇을 의미합니까? 또한 구조를 위해 나는 당신이 '시작'을 필요로한다고 믿는다. '시작; Category.first; rescue ...'또한 구조하려고하는 예외의 유형을 알고있는 경우 로깅 후에 적절하게 다시 올리기 때문에 반드시 명시 적으로 지정하지만 명시 적으로 지정합니다. – engineersmnky

+0

확실히 내 신청서와 관련하여 가장 구체적인 예외를 잡으려고 노력할 것입니다. 그러나 이것은 테스트 용이며 작동하지 않기 때문에 Exception을 모든 예외의 루트 클래스로 잡아야했습니다. 데이터베이스 서버를 종료하려고 할 때 코드 블록 중 아무 것도 오류와 관련하여 전자 메일 주소로 전자 메일을 보내지 않았기 때문에 작동하지 않는다고했습니다. 대신 액세스했을 때 오류 페이지가 표시되었습니다. – TrongBang

답변

0

Ruby의 표준 연습은 대신 StandardError에서 상속하는 응용 프로그램 수준 예외를 만드는 것입니다. 이것은 그들을 구출하여 중요한 시스템 수준의 문제를 숨기지 않도록하기위한 것입니다. Rails here에서 예제를 볼 수 있습니다. 그래서 블록이 작동하지 않는 것입니다.

ExceptionStandardError으로 바꾸거나 디버거를 사용하여 해당 줄 중 하나에서 일시 중지하고 데이터베이스를 사용할 수 없을 때 코드를 단계별로 실행하십시오. 일종의 구조 블록에서 자신을 찾아야하며 실제 오류 클래스를 볼 수 있어야 사용할 수 있습니다. 원할 경우 활성 레코드 소스 코드를 통해 올바른 클래스 이름을 찾을 수도 있습니다.)

+0

나는 확실히 나의 신청과 관련하여 가장 구체적인 예외를 잡으려고 노력할 것이다. 그러나 데이터베이스 서버를 시뮬레이션하여 데이터베이스 서버를 종료 할 때 구조 블록을 모두 전자 메일로 보내지 못했습니다. 그래서 나는 예외를 루트 클래스로 잡았다. 여전히 PG :: Error 예외가 발생하지 않은 이유를 알려주십시오. Postgres를 사용하고 있습니다. – TrongBang

관련 문제