Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In flask, should i manually catch all possible error in views?

Tags:

python

flask

I'm new on Flask, when writing view, i wander if all errors should be catched. If i do so, most of view code should be wrappered with try... except. I think it's not graceful.

for example.

@app.route('/')
def index():
    try:
        API.do()
    except:
        abort(503)

Should i code like this? If not, will the service crash(uwsgi+lnmp)?

like image 204
Patrick Z Avatar asked Feb 20 '23 15:02

Patrick Z


1 Answers

You only catch what you can handle. The word "handle" means "do something useful with" not merely "print a message and die". The print-and-die is already handled by the exception mechanism and probably does it better than you will.

For example, this is not handling an exception usefully:

denominator = 0
try:
    y = x / denominator
except ZeroDivisionError:
    abort(503)

There is nothing useful you can do, and the abort is redundant as that's what uncaught exceptions will cause to happen anyway. Here is an example of a useful handling:

try:
    config_file = open('private_config')
except IOError:
    config_file = open('default_config_that_should_always_be_there')

but note that if the second open fails, there is nothing useful to do so it will travel up the call stack and possibly halt the program. What you should never do is have a bare except: because it hides information about what faulted where. This will result in much head scratching when you get a defect report of "all it said was 503" and you have no idea what went wrong in API.do().

Try / except blocks that can't do any useful handling clutter up the code and visually bury the main flow of execution. Languages without exceptions force you to check every call for an error return if only to generate an error return yourself. Exceptions exist in part to get rid of that code noise.

like image 147
msw Avatar answered Jun 01 '23 15:06

msw