오류 처리 ② 정보

7511 단어 Rails

개시하다


나는 이전에 잘못된 문장을 처리한 적이 있다
그게 이거예요.
rails를 통한 오류 처리
이 기사를 쓴 곳.
Rails에 대한 오류 처리프롬을 사용하면 여러 가지 오류를 처리할 수 있지만 개인적으로 자주 사용해서는 안 된다고 생각합니다.
그런 말을 듣고 살짝 조사해 봤습니다.

rails guides에서


rails guides에rescure-from에 있어요.
rescue_from에서 Exception과 StandardError를 지정하면 Rails에서 정확한 예외 처리가 방해되고 심각한 부작용이 발생할 수 있습니다.상당한 이유가 없으면 이 지정을 추천하지 않는다.
이렇게 써있어요.

건의


받은 건의에 의하면
예외 처리가 상당히 심오하고 미숙하게 시행하지 않으면 오히려 발생하는 오류를 미궁으로 몰아넣기 때문에 원칙적으로'오류가 발생하더라도 아무것도 하지 않고 틀에 맡긴 공동 처리'다.
이렇게 말하지만 실제로 응용 프로그램을 만들 때 제로 오류도 매우 어렵다는 것은 의심할 여지가 없다
 
 
어느 정도의 오류 제어점이 필요하다.
많이 쓰면 안 좋다고 하지만 얼마나 걸릴지...
 
 
나는 거기에서gitlab의 원본 코드를 읽었다.
 
rescue_from에서 예외 출력 오류 페이지를 보충하는 코드는 다음과 같다
rescue_from Encoding::CompatibilityError do |exception|
    log_exception(exception)
    render "errors/encoding", layout: "errors", status: 500
  end

  rescue_from ActiveRecord::RecordNotFound do |exception|
    log_exception(exception)
    render_404
  end

  rescue_from(ActionController::UnknownFormat) do
    render_404
  end

  rescue_from Gitlab::Access::AccessDeniedError do |exception|
    render_403
  end

  rescue_from Gitlab::Auth::TooManyIps do |e|
    head :forbidden, retry_after: Gitlab::Auth::UniqueIpsLimiter.config.unique_ips_limit_time_window
  end

  rescue_from GRPC::Unavailable, Gitlab::Git::CommandError do |exception|
    log_exception(exception)

    headers['Retry-After'] = exception.retry_after if exception.respond_to?(:retry_after)

    render_503
  end
위에 세 개는 처음부터 rails에 탑재된 거예요.
인코딩 오류,activerecord,actioncontroller 오류.
다음 세 개는 자기 이름.
권한과의 관계...잘 모르겠어요(웃음)
어쨌든 gitlab에서 예외를 보충하는 것은 템플릿이 없을 때 기록이 없을 때 인코딩 문제가 있을 때입니다.
 
보충 오류 시 logexception에서 로그를 출력합니다. 바로 이 코드입니다.
def log_exception(exception)
    Gitlab::Sentry.track_acceptable_exception(exception)

    backtrace_cleaner = request.env["action_dispatch.backtrace_cleaner"]
    application_trace = ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception).application_trace
    application_trace.map! { |t| "  #{t}\n" }
    logger.error "\n#{exception.class.name} (#{exception.message}):\n#{application_trace.join}"
  end
Action Dispatch 같은 건 몰라도 단순히
logger.error "#{exception.class.name} : #{exception.message}"
맞는지 아닌지 모르겠다
요컨대
rescue_from exception
그러지 마세요.
 
 

좋은 웹페이지 즐겨찾기