Solution 1
import logging
logging.basicConfig(level=logging.ERROR,
filename='app.log',
filemode='a',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
from flask import Flask, render_template
app = Flask(__name__)
@app.errorhandler(Exception)
def handle_exception(e):
# log the exception
logging.exception('Exception occurred')
# return a custom error page or message
return render_template('error.html'), 500
from flask import Flask, render_template
app = Flask(__name__)
# configure the logger
logging.basicConfig(level=logging.ERROR,
filename='app.log',
filemode='a',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# register the error handler
@app.errorhandler(Exception)
def handle_exception(e):
# log the exception
logging.exception('Exception occurred')
# return a custom error page or message
return render_template('error.html'), 500
# define the normal route
@app.route('/')
def index():
return 'Hello, world!'
# define the route that raises an exception
@app.route('/error')
def error():
# this will cause a ZeroDivisionError
x = 1 / 0
return 'This will never be returned'
# run the app
if __name__ == '__main__':
app.run(debug=True)
2021-07-07 12:34:56 - werkzeug - ERROR - Exception occurred
Traceback (most recent call last):
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/user/.local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/user/.local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/user/flask_app.py", line 31, in error
x = 1 / 0
ZeroDivisionError: division by zero
Solution 2
from flask import abort
from functools import wraps
def catch_uncaught(function):
"""
catches uncaught exceptions and logs them
aborts the request
"""
@wraps(function)
def wrapper(*args, **kwargs):
try:
res = function(*args, **kwargs)
return res # no errors occurred
except Exception as e:
# log stack trace
logging.error("\n" + traceback.format_exc() + "\n")
# abort the request instead of crashing
abort(500, "Internal Server error, do not retry")
return wrapper
@app.route("/")
@catch_uncaught
def index():
sjkfq # uncaught exception
return "hello"