Это плохое вложение инструкций try / catch?

#python #exception #coding-style

#python #исключение #стиль кодирования

Вопрос:

Мой случай прямо сейчас:

 try:
  try:
    condition
  catch

  try:
    condition
  catch

catch
 major failure
  

Плохо ли иметь такой код? Это слишком сильно загромождает или каковы последствия чего-то подобного?

Ответ №1:

Нет, это довольно распространенное явление (за исключением того, что ключевое слово except вместо catch ). Это зависит от того, что вам нужно сделать, и дизайна.

Что плохо, что я вижу слишком много, так это перехват Exception класса верхнего уровня, а не чего-то более конкретного (например, KeyError). Или создание того же самого.

Комментарии:

1. Очень верно … это except, а не catch. Мой плохой. Сейчас я перехватываю класс Exception, но я расширю его позже, когда у меня будет определено больше материала, так что, вероятно, это даст мне лучший контроль, и в такого рода структуре не будет необходимости. Спасибо за объяснение, высоко ценится.

Ответ №2:

Я бы не стал просто выносить вердикт и утверждать «это плохо», потому что иногда вам это может понадобиться. Python иногда намеренно генерирует исключения вместо того, чтобы позволить вам спросить (делает ли это …?) [девиз EAFP], и в некоторых случаях вложение try/catch полезно — когда это имеет смысл при логическом течении кода.

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

Комментарии:

1. Я согласен с этим. Я сам время от времени использую вложенные исключения, и это не «изначально» плохо. Иногда это может даже улучшить читаемость вашего кода…

2. Прямо сейчас это единственный способ отловить некоторые ошибки в средних операторах … если какая-либо из них завершается неудачей, все остальные становятся бесполезными, и оператор top также становится бесполезным, потому что мне нужно, чтобы все они были выполнены, чтобы выполнить самый верхний оператор. (Т.е. Передать параметры методу класса, который отправит данные во внешний API [Контакты Google]). Спасибо! 🙂

3. @Jorge: Если вы просто тестируете пару условий, то оператор if / else, по-видимому, лучше подходит. Возможно, вы используете try / except здесь как скрытый оператор goto. Если вы опубликуете более подробный код, вы получите более конкретные ответы!