关于错误处理:Python,超时尝试,超过X秒后的语句?

Python, Timeout of Try, Except Statement after X number of seconds?

我一直在寻找这个,但似乎无法找到一个确切的答案(大多数进入更复杂的事情,如多线程等),我只是想做一些像Try,Except声明,如果过程没有完成 在X秒内,它将抛出异常。

编辑:原因是我使用的网站测试软件(selenium)的配置有时会导致它挂起。 它不会抛出错误,不会超时或做任何事情,所以我无法捕获它。 我想知道最好的方法是确定这已经发生了所以我可以继续我的应用程序,所以我在想我是否可以做一些事情,"如果这还没有完成X秒......继续前进"。


如果没有某种多线程或多处理,你就无法做到这一点,即使它隐藏在某些抽象层之下,除非你正在运行的"进程"是专门为异步性设计的,并且偶尔回调一个已知的函数。

如果您描述该过程实际上是什么,那么提供真正的解决方案会更容易。我不认为你欣赏Python的强大功能,它涉及到完整的简洁实现。即使使用多线程/多处理,也可能只需要几行代码即可实现。


答案(和问题)并不特定于try / except语句。如果你想要一个不是无限的无限循环(但在一段时间后停止),它可能不应该是无限的。例如,将其更改为使用:

1
while time <= some_value:

或者在循环体上添加一个额外的检查,使其在您希望停止时中断:

1
2
3
4
while True:
    ...
    if time > some_value:
        break

如果那是不可能的(例如,因为你根本不控制循环),事情会变得更加困难。在许多系统上,您可以使用signal.alarm在一段时间后传递信号,然后使用signal.SIGALRM的信号处理程序来引发TimeoutError异常。根据无限循环的实际作用,这可能会也可能不会起作用;如果它阻止信号,或捕获和忽略异常,或以任何其他方式干扰信号处理程序,那将无法工作。另一种可能性是不在当前过程中进行循环,而是在另一个循环中进行循环;然后,您可以随意终止单独的流程。然而,除了终止它之外做任何事情并不容易,因此清理或恢复部分工作非常困难。 (线程根本不起作用,因为没有办法中断执行无限循环的单独线程。)


如果您使用的是UNIX的通用解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time as time
import signal

#Close session
def handler(signum, frame):
    print 1
    raise Exception('Action took too much time')


signal.signal(signal.SIGALRM, handler)
signal.alarm(3) #Set the parameter to the amount of seconds you want to wait

try:
    #RUN CODE HERE

    for i in range(0,5):
        time.sleep(1)
except:
    print 2

signal.alarm(10) #Resets the alarm to 10 new seconds
signal.alarm(0) #Disables the alarm