星辰皇 发表于 2023-5-7 15:59:46

不理解

问题:我执行答案那个代码时,按ctrl+c或者ctrl+d都会报错,而不会打印输入错误,为什么?
题目:
猜数字游戏中input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。
代码:
import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")   
    guess = int(temp)
except (ValueError, EOFError, KeyboardInterrupt):
    print('输入错误!')
    guess = secret
while guess != secret:
    temp = input("哎呀,猜错了,请重新输入吧:")
    guess = int(temp)
    if guess == secret:
      print("我草,你是小甲鱼心里的蛔虫吗?!")
      print("哼,猜中了也没有奖励!")
    else:
      if guess > secret:
            print("哥,大了大了~~~")
      else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")

歌者文明清理员 发表于 2023-5-7 16:02:32

本帖最后由 歌者文明清理员 于 2023-5-7 16:21 编辑

这个问题可能是因为你在执行代码时,使用的操作系统是Windows,而不是Unix/Linux。在Windows下,Ctrl+c 和 Ctrl+d 分别代表中断和结束进程,而不是和Unix/Linux下一样代表终止输入和文件末尾(EOF)。

如果你想要在Windows下终止输入,可以尝试按下 Ctrl+z 键。

另外,对于捕获处理 input() 的两类异常,你可以修改代码如下:

import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")

    guess = int(temp)
except (ValueError):
    print('输入错误!')
    guess = secret
except (EOFError, KeyboardInterrupt):
    print('游戏被终止!')
while guess != secret:
    try:
      temp = input("哎呀,猜错了,请重新输入吧:")
      guess = int(temp)
    except (ValueError):
      print('输入错误!')
    except (EOFError, KeyboardInterrupt):
      print('游戏被终止!')
      break
if guess == secret:
    print("我草,你是小甲鱼心里的蛔虫吗?!")
    print("哼,猜中了也没有奖励!")
else:
    if guess > secret:
      print("哥,大了大了~~~")
    else:
      print("嘿,小了,小了~~~")
if guess == secret:
    print("游戏结束,不玩啦^_^")
else:
    print("游戏被终止!")

通过以上代码,可以在捕获异常后,给用户友好的提示,提高用户体验。
要注意的是,在运行except的时候如果也遇上ctlrc或ctrld,程序也会终止
另外你只捕获了一处,整个代码都捕获的话,会使代码很难看,很繁琐

还有while循环前的guess=secret,没缩进的那个,得删

isdkz 发表于 2023-5-7 16:02:45

从你提供的代码来看,只有在第一次输入时捕获了异常。当第一次输入时发生异常,程序会打印“输入错误!”并将 guess 设置为 secret 。在后面的 while 循环中,如果用户再次按下Ctrl+C或Ctrl+D,代码并没有处理这些异常,所以会直接报错。

为了解决这个问题,你可以在 while 循环中也捕获这些异常。修改后的代码如下:

import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")   
    guess = int(temp)
except (ValueError, EOFError, KeyboardInterrupt):
    print('输入错误!')
    guess = secret
while guess != secret:
    try:
      temp = input("哎呀,猜错了,请重新输入吧:")
      guess = int(temp)
    except (ValueError, EOFError, KeyboardInterrupt):
      print('输入错误!')
      continue
    if guess == secret:
      print("我草,你是小甲鱼心里的蛔虫吗?!")
      print("哼,猜中了也没有奖励!")
    else:
      if guess > secret:
            print("哥,大了大了~~~")
      else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")


这样,当用户在 while 循环中按下Ctrl+C或Ctrl+D时,程序会捕获这些异常并打印“输入错误!”,然后继续执行循环。

liuhongrun2022 发表于 2023-5-7 16:05:00

我也来凑个热闹(ChatGPT):
这是因为 Ctrl+C 和 Ctrl+D 实际上是操作系统级别的组合键,当你按下这些组合键时,终端会立即中止程序运行,而不是生成一个异常。因此,我们需要使用 try...except 语句捕获并处理这些操作系统级别的信号。

下面是修改过的代码:

import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
except ValueError:
    print('输入错误!重新输入')
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
except (EOFError, KeyboardInterrupt):
    print('再见!')
    exit()
while guess != secret:
    try:
      temp = input("哎呀,猜错了,请重新输入吧:")
      guess = int(temp)
    except ValueError:
      print('输入错误!重新输入')
    except (EOFError, KeyboardInterrupt):
      print('再见!')
      exit()
    if guess == secret:
      print("我草,你是小甲鱼心里的蛔虫吗?!")
      print("哼,猜中了也没有奖励!")
    else:
      if guess > secret:
            print("哥,大了大了~~~")
      else:
            print("嘿,小了,小了~~~")

print("游戏结束,不玩啦^_^")
在这个版本的代码中,我们使用了两个 try...except 语句。第一个 try...except 语句用于捕获初始输入时可能发生的 ValueError 异常和 EOFError 和 KeyboardInterrupt 异常,以提高程序的健壮性。如果发生了 ValueError 异常,则提示用户重新输入。如果发生了 EOFError 或 KeyboardInterrupt 异常,则直接退出程序。

第二个 try...except 语句用于捕获猜数字时可能发生的 ValueError 异常和 EOFError 和 KeyboardInterrupt 异常。如果发生了 ValueError 异常,则提示用户重新输入。如果发生了 EOFError 或 KeyboardInterrupt 异常,则直接退出程序。

这样,即使用户按下了 Ctrl+C 或 Ctrl+D,程序也能够优雅地退出,避免了运行时错误,并且可以提供更好的用户体验。

歌者文明清理员 发表于 2023-5-7 16:05:59

liuhongrun2022 发表于 2023-5-7 16:05
我也来凑个热闹(ChatGPT):

《真·优雅》
我试过了,在except里如果你卡bug又作死按了一次ctrlc……

歌者文明清理员 发表于 2023-5-7 16:08:57

歌者文明清理员 发表于 2023-5-7 16:05
《真·优雅》
我试过了,在except里如果你卡bug又作死按了一次ctrlc……

新版python好像卡不出来了

sfqxx 发表于 2023-5-7 16:36:25

当用户按下组合键 Ctrl+d 时,它实际上结束了程序的输入流并引发 `EOFError` 异常。而当用户按下组合键 Ctrl+c 时,它被认为是一个中断,并引发 `KeyboardInterrupt`异常。对于这些异常应该有特殊的处理。

在修改的代码中,使用 `try-except` 语句来捕获输入中可能出现的两类异常,提高用户的体验。如果有任何错误, 都告诉用户输入错误,然后把默认值设置为盲猜。示例代码如下:


import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")   
    guess = int(temp)
except (ValueError, EOFError, KeyboardInterrupt):
    print('输入错误!')
    guess = secret
while guess != secret:
    try:
      temp = input("哎呀,猜错了,请重新输入吧:")
      guess = int(temp)
    except (ValueError, EOFError, KeyboardInterrupt):
      print('输入错误!')
      guess = secret
    if guess == secret:
      print("我草,你是小甲鱼心里的蛔虫吗?!")
      print("哼,猜中了也没有奖励!")
    else:
      if guess > secret:
            print("哥,大了大了~~~")
      else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")

在上面的代码里面,我们在 while 循环中使用一个 try-except 块来捕获 `ValueError` 异常,因为当用户输入的字符串无法转换为整数时会引发此异常。如果出现这种情况,我们会向用户发出警告,并把`guess` 的值设置为 `secret`,以免产生错误。

同样地,我们还捕获了 `EOFError` 和 `KeyboardInterrupt` 异常。当用户按下 Ctrl+d 时,输入流会被结束并引发 `EOFError` 异常,而用户按下 Ctrl+c 时,则会引发 `KeyboardInterrupt` 异常。在捕获这两个异常后,我们会向用户发出警告,并把 `guess` 的值设置为 `secret`,以便让用户能够重新开始游戏。
有用请设置最佳答案

歌者文明清理员 发表于 2023-5-7 19:08:15

{:10_244:}
页: [1]
查看完整版本: 不理解