Ответ (и вопрос) не относится к выражению try / исключением. Если вы хотите иметь бесконечный цикл, который не является бесконечным (но останавливается через некоторое время), он, вероятно, не должен быть бесконечным. Например, измените его на использование:
while time <= some_value:
Или добавьте дополнительную проверку к телу цикла, разрывая его, когда вы хотите, чтобы он остановился:
while True:
...
if time > some_value:
break
Если это невозможно (например, потому что вы вообще не контролируете цикл), все становится значительно сложнее. Во многих системах вы можете использовать signal.alarm
для доставки сигнала через некоторое время, а затем иметь обработчик сигнала для signal.SIGALRM
, который вызывает ваше исключение TimeoutError
. Это может или не может работать в зависимости от того, что фактически делает бесконечный цикл; если он блокирует сигналы, или перехватывает и игнорирует исключения, или каким-либо другим образом мешает обработчику сигналов, это не сработает. Другой возможностью было бы сделать цикл не в текущем процессе, а в отдельном; затем вы можете прекратить отдельный процесс по своему усмотрению. Однако будет нелегко что-либо сделать, кроме как прекратить его, поэтому очистка или восстановление частичной работы очень трудны. (Потоки вообще не будут работать, потому что нет способа прервать отдельный поток, выполняя бесконечный цикл.)