第033讲:异常处理,程序异常在pycharm和IDLE里不一样
本帖最后由 tytommy 于 2020-12-16 19:47 编辑动动手1
input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。
while 1:
try:
n = input('请输入:')
break
except (KeyboardInterrupt,EOFError):
print('错啦不要用CTRL+C或CTRL+D')
在IDLE里是正常的:
在pycharm里:
CTRL+C 没有报错反应
CTRL+D 陷入死循环
为什么呢,pycharm的报错机制不一样?还是里面有防误操作设置 应该是 pycharm 的异常处理优先对异常进行了处理,从而导致异常未能传递到 Python 解释器。 jackz007 发表于 2020-12-16 20:00
应该是 pycharm 的异常处理优先对异常进行了处理,从而导致异常未能传递到 Python 解释器。
CTRL+D 死循环咋回事嘞{:10_254:} tytommy 发表于 2020-12-16 20:08
CTRL+D 死循环咋回事嘞
Ctrl+D 是 pycharm 的快捷键, 会被 pycharm 接收并处理,根本不可能传递到 Python 解释器。 jackz007 发表于 2020-12-16 20:19
Ctrl+D 是 pycharm 的快捷键, 会被 pycharm 接收并处理,根本不可能传递到 Python 解释器。
我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环
tytommy 发表于 2020-12-16 21:25
我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环
我把你的代码写成文件,用 python 解释器执行,发现程序可以捕获 Ctrl - C 按键,却未能将 Ctrl - D 作为异常进行捕获。
#coding:gbk
while 1:
try:
n = int(input('请输入:'))
print('n = ' , n)
except (KeyboardInterrupt,EOFError):
print('错啦不要用CTRL+C或CTRL+D')
执行实况
D:\00.Excise\Python>python x.py
请输入:^D
Traceback (most recent call last):
File "x.py", line 5, in <module>
n = int(input('请输入:'))
ValueError: invalid literal for int() with base 10: '\x04'
D:\00.Excise\Python> tytommy 发表于 2020-12-16 21:25
我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环
我终于搞清楚了,在 Linux 系统下, EOFError 确实由 Ctrl-D 引起,IDLE 模拟了 Linux 运行环境,在 Windows 下,EOFError 只能由按下 Ctrl-Z 或 F6 才能引发。
页:
[1]