Python: assert не выводит сообщение об ошибке - PullRequest
2 голосов
/ 11 мая 2019

Я использую утверждение в многопоточной среде, чтобы помочь мне обнаружить ранние ошибки.Но оказывается, что когда утверждение не удалось, python3.7 просто молча завершается без вывода сообщения об ошибке, которое я хочу увидеть.Спасибо за помощь заранее.

Вот пример кода:

from concurrent.futures import ThreadPoolExecutor
import threading
import random
from time import sleep
def task():
    assert False, "no assertion output, why?"
    print("Executing our Task")
    sleep(5)
    result = 0
    i = 0
    for i in range(10):
        result = result + i
    print("I: {}".format(result))
    print("Task Executed {}".format(threading.current_thread()))

if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=3)
    task1 = executor.submit(task,1)
    task2 = executor.submit(task,1)
    #task(), directly calling and the assertion failure message will be printed out.

Я запустил его с помощью команды python3.7 test.py

Я думаю, что использовал утверждение Python внеправильный путь, потому что я предполагаю, что это функция assert в c ++.Если я изменяю утверждение на выдачу исключения, приведенный выше код тоже не печатается.Должен ли я перехватить исключение?

Кстати, напрямую вызывая его, и будет отображаться сообщение об ошибке подтверждения.

1 Ответ

3 голосов
/ 11 мая 2019

Проблема в том, что вы извлекаете фьючерсы (присваиваете возвращаемые значения task1 и task2), но ничего не делаете с ними. Попробуйте что-то вроде этого.

for future in futures.as_completed([task1, task2]):
    if future.exception() is not None
        # Process the results here.

Это удалит расу, которая у вас сейчас есть.

...