Python中如何实现在程序意外中止后播放警告音
经常爬着爬着就返回意外或者报错了,而且出现意外的点不止一处,难以预测,全都套 try 有点多。
对 python 的错误处理不大了解,有什么精炼的应对方法嘛?至少出了错能出点声或者发个邮件啥的。
有人指点一下嘛?
Python中如何实现在程序意外中止后播放警告音
观察者
监听一下多久没反应就告警呗
这个问题挺有意思的。在Python里,要让程序意外中止时播放警告音,关键是捕获程序退出的信号,然后在退出前执行播放音频的操作。这里用atexit模块配合winsound(Windows)或playsound(跨平台)来实现。
下面是一个完整的示例代码。它注册了一个退出处理函数,无论程序是正常结束还是因为异常、Ctrl+C而中止,都会尝试播放一个警告音。
import atexit
import sys
import os
def play_warning_sound():
"""播放警告音的函数"""
try:
# 方案1: Windows系统使用winsound
if sys.platform == 'win32':
import winsound
# 播放系统警告声,频率1000Hz,持续500ms
winsound.Beep(1000, 500)
# 方案2: 跨平台方案,需要安装playsound库
else:
from playsound import playsound
# 可以播放本地音频文件
# 这里使用一个简短的beep声,你需要准备一个beep.mp3文件
# 或者使用系统声音文件路径
playsound('beep.mp3')
except Exception as e:
# 如果播放失败,至少打印个信息
print(f"无法播放警告音: {e}")
def setup_exit_handler():
"""设置退出处理函数"""
# 注册退出时执行的函数
atexit.register(play_warning_sound)
# 对于Ctrl+C等信号也进行捕获
import signal
def signal_handler(sig, frame):
print("\n程序被中断,播放警告音...")
play_warning_sound()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler) # Ctrl+C
signal.signal(signal.SIGTERM, signal_handler) # 终止信号
if __name__ == "__main__":
# 设置退出处理
setup_exit_handler()
print("程序开始运行...")
print("尝试Ctrl+C中断程序,或者等待10秒自动结束")
# 模拟程序运行
import time
time.sleep(10)
# 模拟一个异常(取消注释测试)
# raise ValueError("测试异常")
print("程序正常结束")
代码说明:
-
核心机制:使用
atexit.register()注册退出函数,这样无论程序如何退出,注册的函数都会被执行。 -
信号处理:额外捕获了
SIGINT(Ctrl+C)和SIGTERM信号,确保在这些情况下也能播放声音。 -
跨平台考虑:
- Windows:直接用内置的
winsound.Beep() - 其他系统:需要安装
playsound库(pip install playsound),并准备一个简短的音频文件
- Windows:直接用内置的
-
异常处理:在
play_warning_sound()里加了try-except,防止播放失败导致程序退出问题。
使用注意:
- 如果要用跨平台方案,记得先
pip install playsound - 可以替换成其他音频播放库,比如
pydub或simpleaudio - 对于长时间运行的程序,这个方案很可靠
一句话总结:用atexit加信号捕获来确保退出时执行播放声音的函数。
try: start_spider()
except: beep()
这么粗放的嘛……
你这样 try 就没有问题啊
try:
try:
except: … throw Exception
try:
except: … throw Exception
try:
except: … throw Exception
try:
except: … throw Exception
try:
except: … throw Exception
except:
beep()
print("\a")
首先,经常出错你就得检查一下你的代码了,如果是固定的一些地方出错,那就加异常捕获把,如果是随机出错,那就写个进程守护就好了嘛,supervisord 好像有邮件报警的功能
mac 调起 shell say xxx
现在就是错一次打一点补丁,但就是经常过了几个小时才想起来看一眼。
简单的话可以 print 一个 bell 字符,终端一般会响。
复杂的话根据平台发送通知。Python 应该有现成的库。
这个第一次知道,666。加了一秒延迟,无限循环了。
用 supervisor autorestart 它吧
sentry, systemd
不过最靠谱的还是碰到问题 LOG 下来,或者写到 csv 里面,程序继续跑。
后面根据出错的日志将错误的信息重新搞一下。
用 server 酱


