From 1431cb26d3f753fddf1acace46d49214d5853e0c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 1 Jun 2022 08:08:52 +0530 Subject: [PATCH] fix: Catch any expection and show proper error page - Also, show title & message if it is defined in the exception class --- frappe/templates/web.html | 2 +- frappe/website/page_renderers/error_page.py | 8 +++++++- frappe/website/page_renderers/template_page.py | 18 ++++++------------ frappe/www/error.html | 6 +++--- frappe/www/error.py | 6 ++++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/frappe/templates/web.html b/frappe/templates/web.html index 48fbce7cd1..df5ee9aeef 100644 --- a/frappe/templates/web.html +++ b/frappe/templates/web.html @@ -26,7 +26,7 @@ {% endif %} -
+
{%- block page_content -%}{%- endblock -%}
diff --git a/frappe/website/page_renderers/error_page.py b/frappe/website/page_renderers/error_page.py index 613809bfdc..6a3925967c 100644 --- a/frappe/website/page_renderers/error_page.py +++ b/frappe/website/page_renderers/error_page.py @@ -5,7 +5,13 @@ class ErrorPage(TemplatePage): def __init__(self, path=None, http_status_code=None, exception=None): path = "error" super().__init__(path=path, http_status_code=http_status_code) - self.http_status_code = getattr(exception, "http_status_code", None) or http_status_code or 500 + self.exception = exception def can_render(self): return True + + def init_context(self): + super().init_context() + self.context.http_status_code = getattr(self.exception, "http_status_code", None) or 500 + self.context.error_title = getattr(self.exception, "title", None) + self.context.error_message = getattr(self.exception, "message", None) diff --git a/frappe/website/page_renderers/template_page.py b/frappe/website/page_renderers/template_page.py index 2ed8a62119..83f68d3716 100644 --- a/frappe/website/page_renderers/template_page.py +++ b/frappe/website/page_renderers/template_page.py @@ -212,19 +212,13 @@ class TemplatePage(BaseTemplatePage): def run_pymodule_method(self, method_name): if hasattr(self.pymodule, method_name): - try: - import inspect + import inspect - method = getattr(self.pymodule, method_name) - if inspect.getfullargspec(method).args: - return method(self.context) - else: - return method() - except (frappe.PermissionError, frappe.DoesNotExistError, frappe.Redirect): - raise - except Exception: - if not frappe.flags.in_migrate: - frappe.errprint(frappe.utils.get_traceback()) + method = getattr(self.pymodule, method_name) + if inspect.getfullargspec(method).args: + return method(self.context) + else: + return method() def render_template(self): if self.template_path.endswith("min.js"): diff --git a/frappe/www/error.html b/frappe/www/error.html index d63daec759..142897c35a 100644 --- a/frappe/www/error.html +++ b/frappe/www/error.html @@ -23,15 +23,15 @@
- {{_("Uncaught Server Exception")}} + {{ error_title }}
-

{{_("There was an error building this page")}}

+

{{ error_message }}

{{ _("Home") }}

- {{ _("Error Code: {0}").format('500') }} + {{ _("Error Code: {0}").format(http_status_code) }}