如何处理python信号异常?

时间:2015-01-08 08:06:45

标签: python try-catch signals alarm

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)

如何正确处理信号异常?此外,我试图处理超时异常,它也不起作用。

它只是打印"错误:超时"到控制台后,程序将关闭。

提前致谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

最好为超时异常创建一个特定的异常类,以便区分它和其他异常。

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()

答案 2 :(得分:-4)

尝试使用以下代码段:

try:
//CODE
except Exception,e:
//handle the exception.

重点不是使用表达式Exception as e