Вступление
В этой статье мы собираемся взглянуть на предложение try / except и, в
частности, на то, как вы можете поймать несколько исключений в одной
строке, а также на то, как использовать метод suppress()
.
Оба этих метода помогут вам в написании более доступного и универсального кода, который придерживается принципов DRY (не повторяйтесь).
Начнем с рассмотрения проблемы:
try:
do_the_thing()
except TypeError as e:
do_the_other_thing()
except KeyError as e:
do_the_other_thing()
except IndexError as e:
do_the_other_thing()
Жестокий.
Как мы видим, это очень ВЛАЖНЫЙ код, мы повторяем один и тот же вызов несколько раз. Подобные практики могут превратить чтение и рефакторинг нашего кода в настоящий кошмар.
Вместо того, чтобы писать исключения одно за другим, не лучше ли сгруппировать все эти обработчики исключений в одну строку?
Множественные исключения
Если вы здесь для быстрого ответа, все просто: используйте кортеж .
Все ошибки, содержащиеся в кортеже строки исключения, будут оцениваться вместе:
try:
do_the_thing()
except (TypeError, KeyError, IndexError) as e:
do_the_other_thing()
Легко, правда?
Избегайте плохих практик
«Ошибки никогда не должны проходить незаметно». - Дзен Python .
Предложения try / except , вероятно, являются наиболее неправильным шаблоном в Python.
При неправильном использовании они становятся клише пьяных и фонарных столбов, используемыми только тогда, когда интерпретатор Python начинает колядовать «12 ошибок Рождества».
Очень заманчиво просто try
решить проблему, сделав простое исключение,
чтобы «заставить ее исчезнуть». Поступая таким образом, мы эффективно
скрываем исключения, что очень жаль, тем более, что они могут быть очень
полезны при восстановлении после потенциально фатальных ошибок или
пролить свет на скрытые ошибки.
Вот почему при использовании предложений except вы всегда должны обязательно указывать ошибки, с которыми, как вы знаете, могут столкнуться, и исключать те, с которыми вы не сталкиваетесь.
Допустить ошибку вашей программы - это нормально, даже лучше, чем просто притвориться, что проблемы не существует.
«Ошибки никогда не должны проходить тихо ... если только они не заглушаются явным образом».
Однако однажды в синюю луну, когда у вас есть возможность игнорировать
обработку исключений, вы можете использовать suppress()
:
from contextlib import suppress
with suppress(TypeError, KeyError, IndexError):
do_the_thing()
Метод suppress()
принимает в качестве аргумента ряд исключений и
выполняет попытку / исключение / передачу с этими ошибками. Как
видите, это также позволяет писать несколько исключений в одной строке.
Это позволит вам избежать написания try / except / pass вручную:
try:
do_the_thing()
except (TypeError, KeyError, IndexError) as e:
pass
А еще лучше, он также стандартен для любой версии Python 3.4 и выше !
Заключение
В этой статье мы рассмотрели, как обрабатывать несколько исключений в
одной строке. Мы также вкратце рассмотрели некоторые плохие практики
игнорирования исключений и использовали supress()
для явного
подавления исключений.