Python中如何实现在程序意外中止后播放警告音

经常爬着爬着就返回意外或者报错了,而且出现意外的点不止一处,难以预测,全都套 try 有点多。

对 python 的错误处理不大了解,有什么精炼的应对方法嘛?至少出了错能出点声或者发个邮件啥的。

有人指点一下嘛?


Python中如何实现在程序意外中止后播放警告音
15 回复

观察者
监听一下多久没反应就告警呗


这个问题挺有意思的。在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("程序正常结束")

代码说明:

  1. 核心机制:使用atexit.register()注册退出函数,这样无论程序如何退出,注册的函数都会被执行。

  2. 信号处理:额外捕获了SIGINT(Ctrl+C)和SIGTERM信号,确保在这些情况下也能播放声音。

  3. 跨平台考虑

    • Windows:直接用内置的winsound.Beep()
    • 其他系统:需要安装playsound库(pip install playsound),并准备一个简短的音频文件
  4. 异常处理:在play_warning_sound()里加了try-except,防止播放失败导致程序退出问题。

使用注意

  • 如果要用跨平台方案,记得先pip install playsound
  • 可以替换成其他音频播放库,比如pydubsimpleaudio
  • 对于长时间运行的程序,这个方案很可靠

一句话总结:用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 酱

回到顶部