tytommy 发表于 2020-12-16 19:43:44

第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的报错机制不一样?还是里面有防误操作设置

jackz007 发表于 2020-12-16 20:00:56

      应该是 pycharm 的异常处理优先对异常进行了处理,从而导致异常未能传递到 Python 解释器。

tytommy 发表于 2020-12-16 20:08:05

jackz007 发表于 2020-12-16 20:00
应该是 pycharm 的异常处理优先对异常进行了处理,从而导致异常未能传递到 Python 解释器。

CTRL+D 死循环咋回事嘞{:10_254:}

jackz007 发表于 2020-12-16 20:19:26

tytommy 发表于 2020-12-16 20:08
CTRL+D 死循环咋回事嘞

       Ctrl+D 是 pycharm 的快捷键, 会被 pycharm 接收并处理,根本不可能传递到 Python 解释器。

tytommy 发表于 2020-12-16 21:25:20

jackz007 发表于 2020-12-16 20:19
Ctrl+D 是 pycharm 的快捷键, 会被 pycharm 接收并处理,根本不可能传递到 Python 解释器。

我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环

jackz007 发表于 2020-12-16 21:51:15

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>

jackz007 发表于 2020-12-16 22:03:36

tytommy 发表于 2020-12-16 21:25
我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环

       我终于搞清楚了,在 Linux 系统下, EOFError 确实由 Ctrl-D 引起,IDLE 模拟了 Linux 运行环境,在 Windows 下,EOFError 只能由按下 Ctrl-Z 或 F6 才能引发。
页: [1]
查看完整版本: 第033讲:异常处理,程序异常在pycharm和IDLE里不一样