Не лови все!

В то время как это часто заманчивым , чтобы поймать каждый Exception :

 try:
    very_difficult_function()
except Exception:
    # log / try to reconnect / exit gratiously
finally:
    print "The END"
    # it runs no matter what execute.

 

Или даже все (что включает в себя BaseException и всех его детей , включая Exception ):

 try:
    even_more_difficult_function()
except:
    pass  # do whatever needed

 

В большинстве случаев это плохая практика. Это может поймать больше , чем предполагалось, например, SystemExit , KeyboardInterrupt и MemoryError - каждый из которых обычно следует обращаться иначе , чем обычные системы или логические ошибки. Это также означает, что нет четкого понимания того, что внутренний код может делать неправильно и как правильно восстанавливаться после этого состояния. Если вы ловите каждую ошибку, вы не будете знать, какая ошибка произошла или как ее исправить.

Это чаще называют «маскированием ошибок» и его следует избегать. Пусть ваша программа аварийно завершает работу, а не молча терпит неудачу или, что еще хуже, терпит неудачу на более глубоком уровне исполнения (Представьте, что это транзакционная система)

Обычно эти конструкции используются на самом внешнем уровне программы и регистрируют детали ошибки, чтобы можно было исправить ошибку или обработать ошибку более конкретно.