Python - Возможно ли принудительно вызывать исключения независимо от блоков try / кроме? - PullRequest
5 голосов
/ 29 апреля 2009

В Python есть ли какая-либо языковая (или интерпретаторная) функция, заставляющая интерпретатор python всегда генерировать исключения, даже если код, вызывающий исключение, находится внутри блока try / исключением?

Я только что унаследовал большую и старую кодовую базу, написанную на python, целью которой является взаимодействие с некоторыми специально разработанными аппаратными средствами, которые мы также разработали. Многие ошибки связи и тайм-ауты маскируются / пропускаются из-за следующего (упрощенного) шаблона кода:

try:
    serialport.write(MSG)
except:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    #or just:
    #pass

Чтобы избежать типичного сценария «просто переписать все с нуля», я сейчас пытаюсь исправить все исключения ошибок / тайм-аутов. Я делаю это, отключая вручную весь код обработки исключений, по одному за раз.

Ответы [ 3 ]

11 голосов
/ 29 апреля 2009

Блок «все исключения» except: - удивительно плохая вещь, и его нужно просто найти и заменить на здравый, за исключением обработки.

В этом случае grep ваш друг. Хорошая IDE может помочь сделать эти неприятные хлопоты управляемыми.

Но в Python нет опции "игнорировать код как написано".

3 голосов
/ 29 апреля 2009

Нет, не совсем. Лучше всего изменить код на что-то вроде этого:

try:
    serialport.write(MSG)
except:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    raise

Это заставит его повторно поднять точное исключение. Главное, что вам нужно понять, это то, что если бы был способ заставить все исключения выйти из системы, вы бы не смогли использовать цикл for (итераторы вызывают исключение StopIteration).

0 голосов
/ 29 апреля 2009

Вы можете использовать несколько обработчиков исключений для обработки нескольких исключений.

try:
    serialport.write(MSG)
except Handler1:
    some_logging_function_mostly_not_working_that_might_be_here_or_not()
    #or just:
    #pass
except Handler2:
    some_logging_function_mostly_not_working_that_might_be_here_or_not2()
    #or just:
    #pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...