diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ca9521fdf..aabb1f5c8 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -73,21 +73,19 @@ class ApplicationController < ActionController::Base end def rescue_exception(exception) - @exception = exception - case exception when ActiveRecord::QueryCanceled render_error_page(500, exception, message: "The database timed out running your query.") when ActionController::BadRequest - render_error_page(400, exception, expected: true) + render_error_page(400, exception) when ActiveRecord::RecordNotFound - render_error_page(404, exception, message: "That record was not found", expected: true) + render_error_page(404, exception, message: "That record was not found.") when ActionController::RoutingError - render_error_page(405, exception, expected: true) + render_error_page(405, exception) when ActionController::UnknownFormat, ActionView::MissingTemplate - render_error_page(406, exception, message: "#{request.format.to_s} is not a supported format for this page", html: true, expected: true) + render_error_page(406, exception, message: "#{request.format.to_s} is not a supported format for this page", format: :html) when Danbooru::Paginator::PaginationError - render_error_page(410, exception, expected: true) + render_error_page(410, exception) when NotImplementedError render_error_page(501, exception, message: "This feature isn't available: #{exception.message}") when PG::ConnectionBad @@ -97,16 +95,15 @@ class ApplicationController < ActionController::Base end end - def render_error_page(status, exception, message: exception.message, html: false, expected: false) - @error_message = message + def render_error_page(status, exception, message: exception.message, format: request.format.symbol) + @exception = exception + @expected = status < 500 + @message = message.encode("utf-8", { invalid: :replace, undef: :replace }) + @backtrace = Rails.backtrace_cleaner.clean(@exception.backtrace) + format = :html unless format.in?(%i[html json xml js atom]) - DanbooruLogger.log(exception, expected: expected) - - if html || !request.format.symbol.in?(%i[html json xml js atom]) - render template: "static/error.html", status: status - else - render template: "static/error", status: status - end + DanbooruLogger.log(@exception, expected: @expected) + render "static/error", status: status, formats: format end def authentication_failed diff --git a/app/logical/danbooru_logger.rb b/app/logical/danbooru_logger.rb index c6d32cd15..4ea882560 100644 --- a/app/logical/danbooru_logger.rb +++ b/app/logical/danbooru_logger.rb @@ -1,6 +1,8 @@ class DanbooruLogger def self.log(exception, expected: false, **params) - if !expected + if expected + Rails.logger.info("#{exception.class}: #{exception.message}") + else backtrace = Rails.backtrace_cleaner.clean(exception.backtrace).join("\n") Rails.logger.error("#{exception.class}: #{exception.message}\n#{backtrace}") end diff --git a/app/views/static/_backtrace.html.erb b/app/views/static/_backtrace.html.erb index c92a33081..a20ea215c 100644 --- a/app/views/static/_backtrace.html.erb +++ b/app/views/static/_backtrace.html.erb @@ -1,6 +1,10 @@ <%# backtrace %>
<%= @message %>
-<%= @exception.message.dup.force_encoding("utf-8") %>
- <%= render "static/backtrace", backtrace: @exception.backtrace %> -<% elsif @error_message %> -<%= @error_message %>
-<% else %> -<%= @exception.message.dup.force_encoding("utf-8") %>
+<% unless @expected %> +