有没有办法让python程序在崩溃时运行一个动作?

时间:2013-12-29 19:37:27

标签: python

我有一个带有循环的python脚本,每次循环都会出现各种异常,需要重新启动。有没有办法在发生这种情况时运行一个动作,以便我可以收到通知?

3 个答案:

答案 0 :(得分:7)

您可以通过为sys.excepthook handler分配自定义函数来安装异常挂钩。只要存在未处理的异常(因此退出解释器),就会调用该函数。

import sys

def myexcepthook(type, value, tb):
    import traceback
    from email.mime.text import MIMEText
    from subprocess import Popen, PIPE
    tbtext = ''.join(traceback.format_exception(type, value, tb))
    msg = MIMEText("There was a problem with your program:\n\n" + tbtext)
    msg["From"] = "me@example.com"
    msg["To"] = "you@example.com"
    msg["Subject"] = "Program exited with a traceback."
    p = Popen(["/usr/sbin/sendmail", "-t"], stdin=PIPE)
    p.communicate(msg.as_string())

sys.excepthook = myexcepthook

只要程序退出,此异常挂钩会通过电子邮件向您发送回溯,前提是您的系统上有sendmail命令。

答案 1 :(得分:0)

你可以使用try/except块来覆盖你的整个程序,我找不到它。另一种方法是在.sh文件中运行python脚本并执行:

#!/bin/bash

while true
do
    python your_script.py
    if $? != 0 then
        sendmail "blabla" "see the doc" "for arguments"
    fi
done

这将执行Python脚本,当它停止时,它会发送一封邮件并重新启动它(因为它是一个无限循环)。只有在Python程序中出现错误且退出代码不同于0时才会发送邮件。为了提高效率,您可以获取stdout,并将其放入邮件中以了解失败的原因以及解决方法。

答案 2 :(得分:0)

你应该这样试试:

while True:
        try:
            x = int(raw_input("Please enter a number: "))
            break
        except ValueError:
            print "Oops!  That was no valid number.  Try again..."