如何处理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信号异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理圆图的Datachange信号?

多时域设计中,如何处理信号跨时域

如何处理重叠 Mousareas 中的按下和释放信号?

IOS 如何处理多个网络请求的先后(依赖)关系

python基础十一(异常)

Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续