diff --git a/templates/show_error.html b/templates/show_error.html index e75e75e..dd79c3c 100644 --- a/templates/show_error.html +++ b/templates/show_error.html @@ -7,24 +7,17 @@ {% block content %}
-

Software error: {{ tb.exception_type }}

+

Software error: {{ exception_type }}

-
{{ tb.exception }}
+
{{ exception }}
-{% set body %} -URL: {{ request.url }} - -{{ tb.plaintext | safe }} -{% endset %} - -

Submit as an issue on GitHub (requires an account with GitHub)

-

Traceback (most recent call last)

-{{ tb.render_summary(include_title=False) | safe }} +{{ summary | safe }} + +

Error in function "{{ last_frame.f_code.co_name }}": {{ last_frame_args | pprint }}

+
{{ last_frame.f_locals | pprint }}
-

Error in function "{{ last_frame.function_name }}": {{ last_frame_args | pprint }}

-
{{ last_frame.locals | pprint }}
{% endblock %} diff --git a/web_view.py b/web_view.py index 51f341f..5809c6e 100755 --- a/web_view.py +++ b/web_view.py @@ -3,6 +3,8 @@ import inspect import json import re +import sys +import traceback from typing import Optional import flask @@ -10,7 +12,7 @@ import lxml.html import requests import werkzeug.exceptions from requests_oauthlib import OAuth1Session -from werkzeug.debug.tbtools import get_current_traceback +from werkzeug.debug.tbtools import DebugTraceback from werkzeug.wrappers import Response from dab_mechanic import mediawiki_api, wikidata_oauth, wikipedia @@ -32,14 +34,25 @@ def global_user() -> None: @app.errorhandler(werkzeug.exceptions.InternalServerError) -def exception_handler(e): - tb = get_current_traceback() - last_frame = next(frame for frame in reversed(tb.frames) if not frame.is_library) - last_frame_args = inspect.getargs(last_frame.code) +def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str, int]: + """Handle exception.""" + exec_type, exc_value, current_traceback = sys.exc_info() + assert exc_value + tb = DebugTraceback(exc_value) + + summary = tb.render_traceback_html(include_title=False) + exc_lines = "".join(tb._te.format_exception_only()) + + last_frame = list(traceback.walk_tb(current_traceback))[-1][0] + last_frame_args = inspect.getargs(last_frame.f_code) + return ( flask.render_template( "show_error.html", - tb=tb, + plaintext=tb.render_traceback_text(), + exception=exc_lines, + exception_type=tb._te.exc_type.__name__, + summary=summary, last_frame=last_frame, last_frame_args=last_frame_args, ),