Python学习——执行python时,键盘按下ctrl+c,退出程序

在 Python 中,当用户按下 Ctrl+C 时,程序默认会触发 KeyboardInterrupt 异常并终止。


1. 捕获 KeyboardInterrupt 异常(推荐)

使用 try-except 块直接捕获 KeyboardInterrupt 异常,适用于简单场景。
示例代码

try:while True:print("程序运行中,按 Ctrl+C 终止...")
except KeyboardInterrupt:print("\n检测到 Ctrl+C!执行清理操作后退出。")
  • 特点
    • 代码简洁,适合快速实现中断处理。
    • 可与其他异常(如 Exception)分开处理,避免混淆逻辑。
  • 适用场景:单线程脚本、需要即时响应中断的场景。

2. 使用 signal 模块处理信号

通过监听操作系统信号 SIGINT(对应 Ctrl+C)实现全局中断处理,适用于复杂场景(如资源清理或数据保存)。
示例代码

import signal
import sysdef signal_handler(sig, frame):print("\n捕获到 Ctrl+C,正在保存数据...")sys.exit(0)signal.signal(signal.SIGINT, signal_handler)  # 绑定信号处理器while True:print("程序运行中,按 Ctrl+C 终止...")
  • 特点
    • 支持更灵活的信号处理(如同时处理 SIGTERM)。
    • 允许多线程环境中主线程统一管理中断。
  • 进阶用法(封装为类):
    class DataProcessor:def __init__(self):self.data = []signal.signal(signal.SIGINT, self.handler)def handler(self, sig, frame):print(f"保存最后一条数据:{self.data[-1]}")sys.exit(0)def run(self):while True:self.data.append(len(self.data))
    
    通过类封装可保存中断时的状态(如最后处理的数据)。

3. 全局异常钩子(sys.excepthook

修改全局异常钩子,统一处理所有未捕获的异常(包括 KeyboardInterrupt)。
示例代码

import sys
import timedef global_except_hook(exctype, value, traceback):if exctype == KeyboardInterrupt:print("\n全局捕获 Ctrl+C,正在终止...")sys.exit(0)sys.__excepthook__(exctype, value, traceback)  # 处理其他异常sys.excepthook = global_except_hookdef main():while True:print("程序运行中...")time.sleep(1)if __name__ == "__main__":main()
  • 特点:适用于未显式使用 try-except 的场景,如第三方库代码引发的中断。

4. 多线程环境处理

在多线程中需注意信号处理的主线程绑定和线程间通信。
示例代码

import signal
import threadingdef worker():while True:print("工作线程运行中...")def signal_handler(sig, frame):print("\n主线程收到 Ctrl+C,通知工作线程停止...")# 此处可设置事件标志通知线程退出exit(0)signal.signal(signal.SIGINT, signal_handler)
thread = threading.Thread(target=worker)
thread.start()while True:pass
  • 注意事项
    • 信号处理器需在主线程中注册。
    • 线程终止可通过事件标志(threading.Event)或队列(queue.Queue)实现协同。

5. 注意事项

  • 避免忽略异常:直接 except: 会屏蔽所有异常,建议明确捕获 KeyboardInterrupt
  • 资源释放:在处理器中关闭文件、释放锁或回滚事务,防止数据损坏。
  • 信号处理限制:部分信号(如 SIGKILL)无法被捕获。
  • 异步任务处理:长时间运行的 C 扩展代码可能延迟信号响应,需结合 faulthandler 模块调试。

应用场景

场景推荐方法引用来源
简单脚本终止try-except
复杂资源清理signal 模块
全局未捕获异常处理sys.excepthook
多线程/分布式程序信号绑定 + 线程通信机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 反向迭代器(Reverse Iterator)实现详解

目录 1. 反向迭代器概述 2. 代码实现分析 3. 关键点解析 3.1 模板参数设计 3.2 核心操作实现 4. 使用示例 1. 反向迭代器概述 反向迭代器是STL中一种重要的适配器,它允许我们以相反的顺序遍历容器。本文将详细讲解如何实现一个自定义的反向迭代器模板类。 2.…

动态DNS管理:【etcd+CoreDNS】 vs【BIND9】便捷性对比

对比 BIND9 集群和 etcdCoreDNS 集群在便捷性方面,通常情况下,对于需要动态、频繁变更 DNS 记录以及追求云原生和自动化集成的场景,etcdCoreDNS 方案更加便捷。 然而,“便捷性”也取决于具体的应用场景、团队的技术栈和运维习惯。…

基于大模型的短暂性脑缺血发作预测与干预全流程系统技术方案大纲

目录 一、系统概述二、系统架构(一)数据采集层(二)大模型核心层(三)应用服务层(四)数据存储与管理层三、全流程技术方案(一)术前阶段(二)术中阶段(三)术后阶段(四)并发症风险预测(五)手术方案制定(六)麻醉方案制定(七)术后护理(八)统计分析(九)技术验…

MSP430通用电机控制代码(Motor)设计与实现

一、代码结构概览 // Motor.h // Motor.h #ifndef __MOTOR_H_ #define __MOTOR_H_#include "A_include.h"void Motor_Init(void); // 初始化函数 void PWM_SET(int duty0, int duty1); // PWM设置函数#endif// Motor.c // Motor.c #include "Motor.h"…

25年软考架构师真题(回忆更新中)

论文题: 系统负载均衡设计方法事件驱动架构多模型数据库应用软件测试架构案例分析: 必选题:1.1填写质量属性的质量属性名 1.2解释器风格架构的组成图填空,以及解释为什么该模型适用解释器风格 选做题1redis2.1全量复制的流程图 <

优化用户体验:拦截浏览器前进后退、刷新、关闭、路由跳转等用户行为并弹窗提示

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 需求 首先列举一下需要拦截的行为&#xff0c;接下来我们逐个实现。 浏览器前进后退标签页刷新和关闭路由跳转 1、拦截浏览器前进后退 这里的实现是核心&#xff0c;涉及到大…

Docker:容器化技术

引言 传统部署环境逐渐不适应现在的企业开发&#xff0c;为了追求更加轻量&#xff0c;更加容易管理项目&#xff0c;引入了docker容器化技术去实现更加高效的部署环境。 一.docker风光下的内核功能和常用命令 1.docker容器和虚拟机的区别 我们在底层和应用层之间引入了一层do…

ping命令常用参数以及traceout命令

在网络故障排查和性能分析中&#xff0c;ping和 traceroute&#xff08;Windows中通常称为 tracert&#xff09;是两个极为重要的工具。它们帮助诊断网络连接问题&#xff0c;了解数据在网络中的传输路径。下面将详细介绍这两个命令的常用参数及其应用。 ping命令 ping命令用…

SpringBoot开发——Spring Boot异常处理全攻略:五大方案实战对比

文章目录 一、血泪教训:异常处理的代价二、五大异常处理方案详解2.1 全局异常处理(推荐方案)2.2 控制器级处理2.3 HTTP状态码注解2.4 ResponseEntity精细控制2.5 自定义异常体系(企业级方案)三、五大方案对比决策表四、四大避坑指南4.1 异常吞噬陷阱4.2 循环依赖问题4.3 异…

CodeBuddy 实现图片转素描手绘工具

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 最近在社交媒体上&#xff0c;各种素描风格的图片火得一塌糊涂&#xff0c;身边不少朋友都在分享自己的 “素描照”&#xff0c;看着那些黑白线条勾勒出的独特韵味&a…

2025.05.21华为暑期实习机考真题解析第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 灾区物资调度路径规划 问题描述 在一次严重的自然灾害后,LYA负责协调救援物资的配送工作。救援区域包含多个受灾乡镇和一个物资集结点,各个地点之间的道路状况各异,有些甚至…

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》学习心得

一、引言 在当今数字化营销浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑着市场格局。GenAI 既是一场充满机遇的变革,也是一场潜在风险的挑战。一方面,绝大多数 B2C 营销领导者对 GenAI 赋能营销抱有极高期待,他们看到了 GenAI 在提升时间与成本效率方面的巨大潜…

探索链表的奇妙世界:从基础到高级应用

链表是计算机科学中一种基础且重要的数据结构&#xff0c;它如同一条由珠子串成的项链&#xff0c;每个珠子&#xff08;节点&#xff09;都包含着数据和指向下一个珠子的线索。 与数组相比&#xff0c;链表在插入和删除操作上更加灵活&#xff0c;无需预先分配固定大小的内存…

黑马点评双拦截器和Threadlocal实现原理

文章目录 双拦截器ThreadLocal实现原理 双拦截器 实现登录状态刷新的原因&#xff1a; ​ 防止用户会话过期&#xff1a;通过动态刷新Token有效期&#xff0c;确保活跃用户不会因固定过期时间而被强制登出 ​ 提升用户体验&#xff1a;用户无需频繁重新登录&#xff0c;只要…

Windows 中动态库.dll 的 .lib 文件有什么作用?

在 Windows 平台开发中, 动态链接库(Dynamic Link Library, DLL)。与之相关的还有一个常让人困惑的文件——.lib 文件。那么,这个 .lib 文件到底有什么作用呢? 一、什么是 .lib 文件? .lib 文件是 静态导入库(Import Library) 文件,它通常与动态链接库(DLL)一起生成…

细说STM32单片机FreeRTOS消息缓冲区及其应用实例

目录 一、消息缓冲区功能概述 二、消息缓冲区操作相关函数 1、相关函数概述 2、部分函数详解 &#xff08;1&#xff09;创建消息缓冲区 &#xff08;2&#xff09;写入消息 &#xff08;3&#xff09;读取消息 &#xff08;4&#xff09;消息缓冲区状态查询 三、消息…

【缓存】JAVA本地缓存推荐Caffeine和Guava

&#x1f31f; 引言 在软件开发过程中&#xff0c;缓存是提升系统性能的常用手段。对于基础场景&#xff0c;直接使用 Java集合框架&#xff08;如Map/Set/List&#xff09;即可满足需求。然而&#xff0c;当面对更复杂的缓存场景时&#xff1a; 需要支持多种过期策略&#x…

IDA插件 MIPSROP的安装和使用方法

前言 笔者的IDA版本为9.0&#xff0c;刚开始根据一些博客描述以为将mipsrop.py拷贝到IDA的plugins目录即可&#xff0c;可操作后发现事情好像没这么简单&#xff0c;复制进去后就发现没有博客中所说的 MIPS ROP Finder &#xff0c;笔者在网上搜索了很多博客后在 https://bbs.…

(1)转置后,行列式的值不变 (2)将行列式的任意两行互换位置后,行列式改变符号

以下是对原始内容在不改变内容本身的前提下进行的格式优化&#xff0c;以提升可读性和逻辑清晰度&#xff1a; ✅ 行列式的几何意义 行列式&#xff08;determinant&#xff09;是线性代数中一个非常重要的概念&#xff0c;它的几何含义可以从以下几个方面理解&#xff1a; &a…

最大似然估计(Maximum Likelihood Estimation, MLE)详解

一、定义 最大似然估计 是一种参数估计方法&#xff0c;其核心思想是&#xff1a; 选择能使观测数据出现概率最大的参数值作为估计值。 具体来说&#xff0c;假设数据 D x 1 , x 2 , … , x n D{x_1,x_2,…,x_n} Dx1​,x2​,…,xn​独立且服从某个概率分布 P ( x ∣ θ ) P(…