#python #exception #python-3.8
Вопрос:
У меня есть многопроцессорная программа — 4 процесса, и внутри них я создаю несколько потоков, поэтому она также многопоточна. У меня не так много опыта в их отслеживании и отладке, я сейчас этим занимаюсь. Однако у меня есть этот блок кода на моем tcp-сервере:
У меня есть исключения, подобные этому
class Error(Exception): """Basic exception""" class NoDataReceived(Error): """Raised when there is no data"""
Теперь код
try: ... if True: raise ValueError('No data receieved') # lt;--- this will print # raise NoDataReceived('There is no data') # lt;--- when i use this it won't print except ValueError as err: # bultin print('err') except NoDataReceived as err: # custom print('err') # Does NOT print..?
Теперь дело в том, что, когда я повышаю ValueError, он распечатывается, когда я поднимаю пользовательский NoDataRecieved, он вообще не печатается.
Я должен сказать, что это многопоточная программа, а также многопроцессорная (потоки в процессе), если я запускаю этот фрагмент кода в однопоточном простом скрипте, он работает так, как должен. Мне не нравится такое поведение. Прежде чем я что-то на этом построю, мне нужно это лучше понять. Я знаю, что мог бы использовать sys_traceback, но я действительно хочу, чтобы это работало так, как должно, просто.
У вас есть объяснение для меня, друзья мои?
[Python 3.8]
Спасибо, что уделили мне время, Кью.
Комментарии:
1. Вы должны были опубликовать всю обратную связь (или, по крайней мере, проверить ее). Это NoDataRec ie ved или NoDataRec ei ved ? Потому что вы определяете одно и улавливаете другое. Также следует отметить, что потоки в Python на самом деле не выполняются параллельно. Google дал бы много результатов по этой теме: Python GIL .
2. Да, я знаю о ГИЛЕ, вот почему я использую многопроцессорную обработку, чтобы фактически запускать ее параллельно, и nodatarieved был просто опечаткой здесь, а не в моем реальном коде, я отредактировал его, но все равно проблема сохраняется