Using try/except blocks is totally fine, but each of them should spell out exactly which errors they're excepting. This is partly for readability, partly to get yourself to think it through fully, and then partly so that errors unrelated to what you're trying to watch for don't get handled with unrelated behavior.

You can do this by including the class names of the errors (which you can see in the stack trace when you encounter them). So for example, when downloading data I [capture scrapelib.HTTPError exceptions](https://github.com/unitedstates/inspectors-general/blob/master/inspectors/utils/utils.py#L61) only, so that other unexpected exceptions will bubble up.

This project has a [generic error handler built in](https://github.com/unitedstates/inspectors-general/blob/master/inspectors/utils/utils.py#L14) -- so that in the future I can do things like automatically email an administator -- but even there it explicitly says `except Exception`, so that it's clear to anyone reading that yes, I'd like to catch everything here.