Перехват исключения TimeoutExpired в Python 3.3

Извините, если это вопрос новичка, но у меня возникли проблемы с обнаружением исключения тайм-аута в Python 3.3, работающем на win7, например.

import subprocess
try:
   subprocess.call("ping -t localhost", timeout=3)
except TimeoutExpired:
    print("Timeout happened.\n")

Тайм-аут работает нормально, и, согласно моей трассировке pdb, он говорит: "raise TimeoutExpired(self.args, timeout)"

но «кроме TimeoutExpired:» не улавливает его. Кроме того, TimeoutExpired не указан в качестве стандартного исключения и выдается как nameError.

Если я попробую "except TimeoutError:" вместо "except TimeoutExpired:", я не получу сообщение об ошибке, но в pdb я получу:

"Uncaught exception"

и команда печати не выполняется в любом случае.

Это баг, или я что-то не так делаю?


person Sarge Gerbode    schedule 14.10.2013    source источник


Ответы (1)


TimeoutExpired не определяется глобально; вместо этого используйте subprocess.TimeoutExpired.

person Peter Rowell    schedule 16.10.2013
comment
Да, но subprocess.TimeoutExpired определенно должен быть производным от TimoutError... не от Exception. Я думаю, это была оплошность - person Erik Aronesty; 08.12.2017
comment
Возможно. Я могу ошибаться, но я думаю, что они выбрали подкласс SubprocessError, потому что это было не исключение в контексте самой программы Python, а дочернего процесса, который она отслеживала. - person Peter Rowell; 08.12.2017