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