@JRBRO

Python exception, какой будет правильным?

Такой вопрос. Запуская через командную строку скрипт включающий в себя цикл, чтобы не выкидывало в случае ошибки, я поставил
cv2.waitKey(0)
        cv2.destroyAllWindows()
 
    except:
            pass


Но с такой компановочкой, я не могу допустим вырубить на середине, не дойдя до конца цикла, только грубым выключением терминала на крестик (ctrl+c, escape и т.д. не работает). Нажимая на enter, он переходит вперед и нельзя оборвать на середине.
Какое исключение позволит оборвать цикл на середине, но без полного закрытия коммандной строки?

И еще, есть ли способ прогнать цикл в обратную сторону. Допустим я иду: 1, 2, 3, 4 и осознаю, что хочу еще раз глянуть 3, такое возможно? Цикл реализован из csv списка.

for s in spisok_csv:
    try:
Здесь описаны действия
    except:
            pass
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
. чтоВообще игнорировать любые исключения - это очень плохая идея. Причин этому много даже за рамками тех, с которыми вы уже столкнулись.
Если вы немного почитаете про обраотку исключений, то увидите блоков except в этой конструкции может быть несколько и они фильтруют происходящие исключения в том порядке, в котором указаны.
В общем случае следует различать два вида исключений: штатные и нештатные.
Штатные - это те исключения о которых вы знаете, которые предусматриваете. В данном контексте это, например KeyboardInterrupt. Кроме того, вам нужно понимать какие ещё исключения порождает ваш код, какие из этих исключений нжно считать штатными, и поэтому как-то конерктно обрабатывать ил игнорировать, а какие считать нештатными.

Нештатные иключения игнорировать и гасить - плохая идея. Каждое нештатное (непредусмотренное) исключения должо вести к поадению программы с подробным тейсбэком, который показывает где и почему произошла ошибка. Поняв из-за чего произошлоа нештатная ошибка, вы сможете либо устранить ошибку в коде, которая к ней приводит, либо обработаете её особым образом на нужном уровне так, чтобы эта ошибка стала штатной.

Если ваш скрипт должен во что бы то ни стало работать и никогда не падать в продакшн-режиме, то можно поступить так:
По факту KeyboardInterrupt делайте её рерайз. Остальные ошибки подробно логируйте и двигайтесь дальше:
for item in items:
    try:
        ...
    except KeyboardInterrupt:
        raise
    except Exception as e:
        with open('errors.log', 'a') as log:
            log.write(f'{e}')
            # сюда же можно вывести трейсбэк, но я бы воспользовался стандартным логированием, чтобы не изобратать велосипед, однако его конфигурирование выходит за рамки данного отета.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Ничерта не понял, но попробую ответить.
1. не используй except без указания исключения, используй хотя бы except Exception - исключение по Ctrl-C (KeyboardInterrupt) не наследуется от Exception и не будет поймано. Указывать pass тоже не лучшая идея - логгируй возникающие исключения, чтобы ты мог потом устранить их причины.
1а. waitKey() возвращает код нажатой клавиши. Сравнивай его с кодом Esc (27) и выходи из цикла так.
2. Если нужно оперировать соседними элементами коллекции, загони её в список (если это не список) и итерируйся по индексам, а не по коллекции.
Или for i in range(len(spisok_csv)): или for i, s in enumerate(spisok_csv):
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы