无法在 Python 中捕获 ValueError

Posted

技术标签:

【中文标题】无法在 Python 中捕获 ValueError【英文标题】:Can't catch ValueError in Python 【发布时间】:2020-02-09 18:47:00 【问题描述】:

我开始学习Python,写了一个很简单的代码来练习try/except。

代码如下:

a = float(input('num1: '))
b = float(input('num2: '))

try:
      result = a / b
except ValueError as e:
      print ('error type: ', type (e))

print(result)

每当我输入一个字母作为数字时,在 except 中的打印工作正常,但代码崩溃。

ZeroDivisionError & TypeError 正常工作,但 ValueError 不工作。

我什至将输入放在单独的 try/except 中,但它仍然无法正常工作。

如何在此处以及在实际应用中处理此错误?

【问题讨论】:

请显示堆栈跟踪。 【参考方案1】:

在您进入 try 块之前发生崩溃。如果您使用当前代码输入字母,它不会在 except 块中打印错误。

简单地将输入部分放在单独的 try 块中不会捕获它 - 您需要一个与发生错误的 try 相关的 except 块,例如

try:
    a = float(input('num1: '))
    b = float(input('num2: '))
except ValueError as e:
    print ('Value Error')

try:
    result = a / b
except ZeroDivisionError as e:
    print ('Zero DivisionError')

print(result)

或者,您可以将输入和除法全部放在 try 块中,并使用您当前的报告进行捕获:

try:
    a = float(input('num1: '))
    b = float(input('num2: '))
    result = a / b
except ValueError as e:
    print ('error type: ', type (e))

print(result)

编辑:请注意,如果其中任何一个发生任何错误,以后都会导致进一步的错误。您最好使用第二个选项,但将 print(result) 移动到 try 块中。这是唯一一次定义它。

【讨论】:

print(result) 会在发生异常时崩溃,因为result 永远不会被定义。 我尝试了第一个选项,但没有成功 - 这让我很惊讶!我将测试第二种解决方案。谢谢 约翰杜兰,我真的要谢谢你!第二种方法解决了问题。

以上是关于无法在 Python 中捕获 ValueError的主要内容,如果未能解决你的问题,请参考以下文章

Python ValueError 异常没有被正确捕获

python单元测试中的assertRaises没有捕获异常[重复]

ValueError:操作数无法与形状一起广播 - inverse_transform- Python

Python:ValueError:无法将字符串转换为浮点数:'0'

在程序的多个部分捕获 ValueError

ValueError:无法将字符串转换为浮点数:在 python 上绘制图形