鱼C论坛

 找回密码
 立即注册
查看: 2393|回复: 6

[已解决]第033讲:异常处理,程序异常在pycharm和IDLE里不一样

[复制链接]
发表于 2020-12-16 19:43:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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里是正常的:
1.png

在pycharm里:
3.png CTRL+C 没有报错反应
2.png CTRL+D 陷入死循环

为什么呢,pycharm的报错机制不一样?还是里面有防误操作设置
最佳答案
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 才能引发。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-16 20:00:56 | 显示全部楼层
        应该是 pycharm 的异常处理优先对异常进行了处理,从而导致异常未能传递到 Python 解释器。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

CTRL+D 死循环咋回事嘞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-16 20:19:26 | 显示全部楼层
tytommy 发表于 2020-12-16 20:08
CTRL+D 死循环咋回事嘞

       Ctrl+D 是 pycharm 的快捷键, 会被 pycharm 接收并处理,根本不可能传递到 Python 解释器。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我把设置里面 CTRL+D 移除了问题还是一样,跳过了input(但是显示'请输入:')和后面的break,一直循环
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 才能引发。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表