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?相关推荐

  1. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  2. 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色

    Python,OpenCV,K-Means聚类查找图像中最主要的颜色 1. K-Means是什么? 2. 步骤 3. 效果图 4. 源代码 参考 对于肉眼来说,从一幅图中识别出主要颜色很容易.那怎么用 ...

  3. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  4. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  5. python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...

    参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...

  6. python统计元素个数_python怎么统计列表中元素的个数

    python统计列表中元素的个数的方法:可以通过count()方法来实现.该方法可以统计字符串中某个字符出现的次数,并返回子字符串在字符串中出现的次数.具体用法如:[count=List.count( ...

  7. python中classes和class的区别-Python中的Classes和Metaclasses详解

    类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个"类对象"并将其赋值给一个同名变量.类是type类型的对象(是不是有点拗口?). 类对象 ...

  8. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  9. python处理csv文件缺失值_python处理数据中缺失值

    (1)直接删除法(当缺失值个数只占整体很小一部分时) 在采用删除法处理缺失值时,需要首先检测样本总体中确实值得的个数.python中统计缺失值的方法为: import numpy as np impo ...

最新文章

  1. asp.net播放声音
  2. [gic]-中断虚拟化-Host和Guest的中断处理流程举例(gicv3举例)
  3. python functools模块(主要是为函数式编程而设计,用于增强函数功能,主要为可调用对象(callable objects)定义高阶函数或操作)
  4. 【数据结构与算法】之深入解析“预测赢家”的求解思路与算法示例
  5. 《移动App测试的22条军规》—App测试综合案例分析23.13节测试微信App的流量和电量消耗...
  6. mysql初始化实例报错_初始化 mysql时报错
  7. WLAN中直接转发和隧道转发流程与封装
  8. 数学逻辑习题集(2)
  9. POI dataFormat种类
  10. 软件工程案例-仓库管理系统简单版
  11. 安全的随想网络空间测绘
  12. Unity3D游戏高性能战争迷雾系统实现
  13. ubuntu+svn+apache配置
  14. C088提示某订单发送失败,缺少评估类型
  15. vue中调用百度地图 获取经纬度
  16. 在WindowsMobil系统中实现透明树组件
  17. 自研·学术·文献查找
  18. 深度ghostxp_sp3至尊纯净版 v2013.08
  19. 2020年iOS 和Android程序员请开始修炼内功
  20. JAVA 从原理到实现,制作license文件,可用于模块授权,程序授权等

热门文章

  1. 使用Java框架Pronghorn编写快速的应用程序
  2. python 行为驱动_什么是行为驱动的Python?
  3. 无论您的工作职能如何,如何获得功绩
  4. onenote组织知识体系_我们的家人教给我们有关组织生活的知识
  5. (9)vue.js 指令(1)
  6. 分布式ID | 这六种分布式ID生成方法,总有一款适合你
  7. es6 next()、throw()、return() 的共同点
  8. editor编辑器为什么头部信息会不见_简单聊一聊一个前端编辑器的性能优化
  9. 视觉SLAM笔记(24) 图像基础操作
  10. php curl无视ssl,用Curl实现Post和Get请求,可绕过SSL验证