Почему Python выводит исключения на консоль перед выводом print () - PullRequest
1 голос
/ 13 января 2020

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

Для каждая строка в ожидаемом формате выводит на консоль сообщение (с помощью функции печати) о том, что строка действительна. В противном случае будет выдана ошибка.

Я ожидаю увидеть серию сообщений о том, что первые X строк действительны, за которыми следует исключение, если возникает ошибка, но вместо этого печатается исключение, затем печатает сообщения, несмотря на то, что они были вызваны из предыдущих итераций l oop.

Может кто-нибудь объяснить, почему это так, потому что я не могу обернуть голову вокруг него?

Возьмите этот короткий, базовый c пример, который я создал:

letters = ['a','b','c']
for letter in letters:
    if letter == 'a' or letter == 'c':
        print ("Valid letter, '" + letter + "' found. Keep going.")
    else:
        raise Exception("Invalid letter, '" + letter + "' found. Break program.")

Он производит следующий вывод:

>>> >>> ... ... ... ... ... Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
Exception: Invalid letter, 'b' found. Break program.
Valid letter, 'a' found. Keep going.
>>> 

Я хочу, чтобы сообщения печатались первыми, как они появляются в коде, и исключение, которое будет напечатано в конце, когда код остановлен, в противном случае он теряется среди загрузки печатных сообщений. Кажется, это только для циклов (в том случае, если я что-то печатаю до l oop, он печатается до исключения). Может ли кто-нибудь предложить какое-либо понимание?

1 Ответ

3 голосов
/ 13 января 2020

Исключения выводятся через стандартный поток error , а не стандартный вывод. В зависимости от терминала, оба выхода не всегда синхронизируются.

Вы можете сделать вывод sh после печати:

print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)

другой вариант - записать стандартную ошибку для ваших сообщений. Это неплохая идея, если вы планируете перенаправить вывод в файл, игнорируя сообщения

sys.stderr.write("Valid letter, '{}' found. Keep going.\n".format(letter))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...