Update error handling to work with werkzeug 2

Closes: #1
This commit is contained in:
Edward Betts 2023-09-29 18:03:39 +01:00
parent 1a479dacbc
commit 0ff82e1c05
2 changed files with 25 additions and 19 deletions

View file

@ -7,24 +7,17 @@
{% block content %} {% block content %}
<div class="p-2"> <div class="p-2">
<h1>Software error: {{ tb.exception_type }}</h1> <h1>Software error: {{ exception_type }}</h1>
<div> <div>
<pre>{{ tb.exception }}</pre> <pre>{{ exception }}</pre>
</div> </div>
{% set body %}
URL: {{ request.url }}
{{ tb.plaintext | safe }}
{% endset %}
<p><a class="btn btn-primary btn-lg" role="button" href="https://github.com/EdwardBetts/dab-mechanic/issues/new?title={{ tb.exception + " " + request.url | urlencode }}&body={{ body | urlencode }}">Submit as an issue on GitHub</a> (requires an account with GitHub)</p>
<h2 class="traceback">Traceback <em>(most recent call last)</em></h2> <h2 class="traceback">Traceback <em>(most recent call last)</em></h2>
{{ tb.render_summary(include_title=False) | safe }} {{ summary | safe }}
<p>Error in function "{{ last_frame.f_code.co_name }}": {{ last_frame_args | pprint }}</p>
<pre>{{ last_frame.f_locals | pprint }}</pre>
<p>Error in function "{{ last_frame.function_name }}": {{ last_frame_args | pprint }}</p>
<pre>{{ last_frame.locals | pprint }}</pre>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -3,6 +3,8 @@
import inspect import inspect
import json import json
import re import re
import sys
import traceback
from typing import Optional from typing import Optional
import flask import flask
@ -10,7 +12,7 @@ import lxml.html
import requests import requests
import werkzeug.exceptions import werkzeug.exceptions
from requests_oauthlib import OAuth1Session 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 werkzeug.wrappers import Response
from dab_mechanic import mediawiki_api, wikidata_oauth, wikipedia from dab_mechanic import mediawiki_api, wikidata_oauth, wikipedia
@ -32,14 +34,25 @@ def global_user() -> None:
@app.errorhandler(werkzeug.exceptions.InternalServerError) @app.errorhandler(werkzeug.exceptions.InternalServerError)
def exception_handler(e): def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str, int]:
tb = get_current_traceback() """Handle exception."""
last_frame = next(frame for frame in reversed(tb.frames) if not frame.is_library) exec_type, exc_value, current_traceback = sys.exc_info()
last_frame_args = inspect.getargs(last_frame.code) 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 ( return (
flask.render_template( flask.render_template(
"show_error.html", "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=last_frame,
last_frame_args=last_frame_args, last_frame_args=last_frame_args,
), ),