python中keyboardinterrupt_为什么我不能在python中处理KeyboardInterrupt?
Jeremy Brown..
21
遗憾的是,异步异常处理不可靠(信号处理程序引发的异常,通过C API在外部上下文中引发的异常等).如果代码中有关于哪些代码负责捕获它们的协调,则可以增加正确处理异步异常的机会(除了非常关键的函数之外,调用堆栈中最高可能是合适的).
被调用的函数(dostuff)或函数向下的函数本身可能有一个您没有/无法解释的KeyboardInterrupt或BaseException的catch.
这个简单的案例适用于python 2.6.6(x64)交互式+ Windows 7(64位):
>>> import time
>>> def foo():
... try:
... time.sleep(100)
... except KeyboardInterrupt:
... print "INTERRUPTED!"
...
>>> foo()
INTERRUPTED! #after pressing ctrl+c
编辑:
经过进一步调查,我尝试了我认为是其他人用来重现问题的例子.我很懒,所以我遗漏了"终于"
>>> def foo():
... try:
... sys.stdin.read()
... except KeyboardInterrupt:
... print "BLAH"
...
>>> foo()
在按CTRL + C后立即返回.有趣的事情发生在我立刻再次打电话给foo时:
>>> foo()
Traceback (most recent call last):
File "c:\Python26\lib\encodings\cp437.py", line 14, in decode
def decode(self,input,errors='strict'):
KeyboardInterrupt
在没有按下CTRL + C的情况下立即引发异常.
这似乎是有道理的 - 似乎我们正在处理如何在Python中处理异步异常的细微差别.在异步异常实际弹出然后在当前执行上下文中引发之前,它可能需要几个字节码指令.(这是我过去玩过时看到的行为)
所以这有点解释了为什么在本例中执行finally语句的上下文中引发了KeyboardInterrupt:
>>> def foo():
... try:
... sys.stdin.read()
... except KeyboardInterrupt:
... print "interrupt"
... finally:
... print "FINALLY"
...
>>> foo()
FINALLY
Traceback (most recent call last):
File "", line 1, in
File "", line 7, in foo
KeyboardInterrupt
可能会有一些疯狂混合的自定义信号处理程序与解释器的标准KeyboardInterrupt/CTRL + C处理程序混合,导致这种行为.例如,read()调用会看到信号和bails,但是在取消注册它的处理程序后它会重新引发信号.如果不检查解释器代码库,我肯定不知道.
这就是为什么我通常不愿意使用异步异常....
编辑2
我认为错误报告是个好例子.
file_read调用Py_UniversalNewlineFread().fread可以使用errno = EINTR(它执行自己的信号处理)返回错误.在这种情况下,Py_UniversalNewlineFread()保释但不会使用PyErr_CheckSignals()执行任何信号检查,以便可以同步调用处理程序.file_read清除文件错误,但也不调用PyErr_CheckSignals().
有关如何使用它的示例,请参阅getline()和getline_via_fgets().该错误报告中记录了类似问题的模式:(http://bugs.python.org/issue1195).所以似乎解释器在不确定的时间处理信号.
我想深入潜水的价值不大,因为仍然不清楚sys.stdin.read()示例是否是你的"dostuff()"函数的正确模拟.(可能会有多个错误)
我不会在异步异常中将其称为"细微差别",而不是一个彻头彻尾的错误.如果异常提升的时间晚于技术上发生的时间,那很好......但是如果在异常爆发的try块外面引发异常,那就是另一个故事了.这里明确地描述了几个记录良好的行为,最重要的是"最终"块不运行"保证"的清理代码; 并且当在"try"块中明确地发生至少一个异常时,根本不运行异常处理程序. (5认同)
python中keyboardinterrupt_为什么我不能在python中处理KeyboardInterrupt?相关推荐
- 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克
使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...
- 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
Python,OpenCV,K-Means聚类查找图像中最主要的颜色 1. K-Means是什么? 2. 步骤 3. 效果图 4. 源代码 参考 对于肉眼来说,从一幅图中识别出主要颜色很容易.那怎么用 ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...
参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...
- python统计元素个数_python怎么统计列表中元素的个数
python统计列表中元素的个数的方法:可以通过count()方法来实现.该方法可以统计字符串中某个字符出现的次数,并返回子字符串在字符串中出现的次数.具体用法如:[count=List.count( ...
- python中classes和class的区别-Python中的Classes和Metaclasses详解
类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个"类对象"并将其赋值给一个同名变量.类是type类型的对象(是不是有点拗口?). 类对象 ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- python处理csv文件缺失值_python处理数据中缺失值
(1)直接删除法(当缺失值个数只占整体很小一部分时) 在采用删除法处理缺失值时,需要首先检测样本总体中确实值得的个数.python中统计缺失值的方法为: import numpy as np impo ...
最新文章
- asp.net播放声音
- [gic]-中断虚拟化-Host和Guest的中断处理流程举例(gicv3举例)
- python functools模块(主要是为函数式编程而设计,用于增强函数功能,主要为可调用对象(callable objects)定义高阶函数或操作)
- 【数据结构与算法】之深入解析“预测赢家”的求解思路与算法示例
- 《移动App测试的22条军规》—App测试综合案例分析23.13节测试微信App的流量和电量消耗...
- mysql初始化实例报错_初始化 mysql时报错
- WLAN中直接转发和隧道转发流程与封装
- 数学逻辑习题集(2)
- POI dataFormat种类
- 软件工程案例-仓库管理系统简单版
- 安全的随想网络空间测绘
- Unity3D游戏高性能战争迷雾系统实现
- ubuntu+svn+apache配置
- C088提示某订单发送失败,缺少评估类型
- vue中调用百度地图 获取经纬度
- 在WindowsMobil系统中实现透明树组件
- 自研·学术·文献查找
- 深度ghostxp_sp3至尊纯净版 v2013.08
- 2020年iOS 和Android程序员请开始修炼内功
- JAVA 从原理到实现,制作license文件,可用于模块授权,程序授权等
热门文章
- 使用Java框架Pronghorn编写快速的应用程序
- python 行为驱动_什么是行为驱动的Python?
- 无论您的工作职能如何,如何获得功绩
- onenote组织知识体系_我们的家人教给我们有关组织生活的知识
- (9)vue.js 指令(1)
- 分布式ID | 这六种分布式ID生成方法,总有一款适合你
- es6 next()、throw()、return() 的共同点
- editor编辑器为什么头部信息会不见_简单聊一聊一个前端编辑器的性能优化
- 视觉SLAM笔记(24) 图像基础操作
- php curl无视ssl,用Curl实现Post和Get请求,可绕过SSL验证