Python 20x4 LCD程序按Ctrl+C触发KeyboardInterrupt时无法执行预设清理代码
为什么你的中断逻辑没生效
- 你写的
if KeyboardInterrupt:完全不是合法的异常捕获逻辑。这个判断的实际作用是检查Python内置的KeyboardInterrupt类对象是否存在,结果永远为真,但根本感知不到你按下Ctrl+C时实际抛出的异常 - 你没有用
try/except结构包裹可能触发中断的代码,当KeyboardInterrupt被抛出时,没有对应代码接住这个异常,程序就会直接终止并打印栈追踪报错
修复方案
只需要把原有无限循环的逻辑用try块包裹,把原来的if判断换成标准的异常捕获分支就行,改完的完整代码可以直接运行:
import drivers from time import sleep from datetime import datetime from subprocess import check_output display = drivers.Lcd() display.lcd_backlight(0) IP = check_output(["hostname", "-I"]).split()[0] usrinpt = input("Text: ") while len(usrinpt) > 20: print("Too Long") usrinpt = input("Text: ") else: display.lcd_backlight(1) print("Writing to display") try: while True: display.lcd_display_string(str(datetime.now().time().strftime("%H:%M:%S")), 1) display.lcd_display_string(str(IP), 2) display.lcd_display_string("____________________", 3) sleep(1) display.lcd_display_string(str(datetime.now().time().strftime("%H:%M:%S")), 1) display.lcd_display_string(str(IP), 2) display.lcd_display_string(str(usrinpt), 3) sleep(1) except KeyboardInterrupt: # 按Ctrl+C时执行清理:关闭背光 display.lcd_backlight(0)
注意要点
- Python里捕获异常的固定写法是
try: 可能抛异常的代码 except 异常类型: 异常处理逻辑,不能直接用if 异常类名:来做判断 try块要覆盖所有可能被Ctrl+C打断的代码段,不然异常还是会直接透出来终止程序- 程序执行完except里的关背光逻辑后就会正常退出,不会再出现之前的Traceback报错
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

