about summary refs log tree commit diff
path: root/uploader/errors.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/errors.py')
-rw-r--r--uploader/errors.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/uploader/errors.py b/uploader/errors.py
new file mode 100644
index 0000000..3e7c893
--- /dev/null
+++ b/uploader/errors.py
@@ -0,0 +1,29 @@
+"""Application error handling."""
+import traceback
+from werkzeug.exceptions import HTTPException
+
+import MySQLdb as mdb
+from flask import Flask, request, render_template, current_app as app
+
+def handle_general_exception(exc: Exception):
+    """Handle generic exceptions."""
+    trace = traceback.format_exc()
+    app.logger.error(
+        "Error (%s.%s): Generic unhandled exception!! (URI: %s)\n%s",
+        exc.__class__.__module__, exc.__class__.__name__, request.url, trace)
+    return render_template("unhandled_exception.html", trace=trace), 500
+
+def handle_http_exception(exc: HTTPException):
+    """Handle HTTP exceptions."""
+    app.logger.error(
+        "HTTP Error %s: %s", exc.code, exc.description, exc_info=True)
+    return render_template("http-error.html",
+                           request_url=request.url,
+                           exc=exc,
+                           trace=traceback.format_exception(exc)), exc.code
+
+def register_error_handlers(appl: Flask):
+    """Register top-level error/exception handlers."""
+    appl.register_error_handler(Exception, handle_general_exception)
+    appl.register_error_handler(HTTPException, handle_http_exception)
+    appl.register_error_handler(mdb.MySQLError, handle_general_exception)