如何处理python信号异常?
Posted
技术标签:
【中文标题】如何处理python信号异常?【英文标题】:How to handle python signal exception? 【发布时间】:2015-01-08 08:06:44 【问题描述】:def signal_handler(signum, frame):
raise Exception("Timeout")
def my_function():
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(1)
try:
call_long_function()
except Exception as e: # Doesn't work
print("Hello, Timeout!")
break
signal.alarm(0)
如何正确处理信号异常?我也尝试处理超时异常,它也不起作用。
它只是将“错误:超时”打印到控制台,然后程序将被关闭。
提前致谢。
【问题讨论】:
你用的是哪个版本的python? @m170897017,Python 2.7.9 【参考方案1】:您最好将 Exception 子类化到您自己的 Exception 类中:
class TimeOutException(Exception):
def __init__(self, message, errors):
super(TimeOutException, self).__init__(message)
self.errors = errors
那么你可以这样做:
def signal_handler(signum, frame):
raise TimeOutException("Timeout!")
然后,在另一个函数中:
try:
call_long_function():
except TimeOutException:
print "Got a timeout!"
break
【讨论】:
我试过了,结果是“错误:超时”。除了块不起作用(最终块起作用) 哦,如果我通过尝试阻止一些代码,例如while(True): pass
,它可以完美运行!但是,如果我传递了一个使用pipes
的长函数,它就不起作用。你有什么想法吗?
对不起;有一个错字。开始 except 块的“except”不应该大写!我更正了。
finally 块有不同的用途。 finally
表示一个总是执行的块;无论是否发生异常。【参考方案2】:
最好为超时异常创建一个特定的异常类,以便区分它和其他异常。
class TimeoutException(Exception):
def __init__(self, *args, **kwargs):
pass
在您的函数中定义一个警报信号,并设置一个计时器。 然后用 try/except 包装你的限时代码。 在此示例中,我使用了两种情况 - 一种用于超时异常类 - 一种用于任何其他类型的异常,假设代码可能因多个原因而失败。
def my_function():
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(1) # Time Limit
try:
time.sleep(120) # Simulation of code exceeding time limit
except TimeoutException:
print "Time out"
except:
print "Some other exception"
def signal_handler(signum, frame):
raise TimeoutException()
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 谢谢,我添加了解释脚本的 cmets。【参考方案3】:尝试使用以下 sn-p:
try:
//CODE
except Exception,e:
//handle the exception.
重点是不要使用表达式Exception as e
【讨论】:
谢谢,但我得到了相同的结果。以上是关于如何处理python信号异常?的主要内容,如果未能解决你的问题,请参考以下文章