Python:ValueError和Exception之间的区别?

时间:2017-04-25 08:33:37

标签: python exception error-handling

我试图了解引发ValueError和Exception之间的区别。我已经尝试了两个相同的代码(即使在同一个分支),结果是相同的 - 我收到了一条错误消息。

我在SO上对这个问题进行了研究,但没有对此进行讨论。然后我阅读了异常文档,发现了以下definition的ValueError:

  

当内置操作或函数接收到具有正确类型但值不合适的参数时引发,并且情况不会由更精确的异常描述,例如IndexError

据我所知,Exception是一个更通用的术语,ValueError可以应用于某些特定情况。但由于提高两者的结果是相同的,我想了解,区分ValueError和Exception的实际意义是什么。 Python版本应该在这里不相关。谢谢!

修改: 感谢您的回答,我得到了它,try-exception构造中两个术语之间的区别是什么。但是,如果只是提高它们,它们如何区别,而不是除外?

raise Exception('blah') 

raise ValueError('blah') 

回答@PeterWood:在这两种情况下我都收到了错误消息" blah",但在一种情况下它是"例外:等等#34;和第二种:&# 34; ValueError:blah"。在这种情况下,我看到它们之间没有实际区别。

3 个答案:

答案 0 :(得分:12)

ValueError继承自Exception。您可以决定仅捕获ValueErrorException,这就是异常继承的用途。

在这个例子中:

try:
    a=12+"xxx"
except Exception:
    # exception is trapped (TypeError)

异常被捕获,所有异常(BaseException例外除外)都被except语句捕获。

在另一个例子中:

try:
    a=12+"xxx"
except ValueError:
    # not trapped

此处,异常未被捕获(TypeError不是ValueError且未继承)

您通常使用特定的异常来仅捕获可能发生的异常(处理文件时最好的例子是IOError),并保留其余部分。捕获所有异常的危险在于获得一段不会崩溃但无效的代码。

在提出异常时编辑答案以响应您的编辑:):您正在创建Exception的实例,该实例将被未来的except ValueError:语句过滤掉。消息是不同的,因为异常的表示(打印时)包括异常类名称。

答案 1 :(得分:1)

你说过,ValueError是一个特定的例外。一个简短的例子:

try:
    print int("hello world")
except ValueError:
    print "A short description for ValueError"

如果你改变了'#hello world"使用int,print int(42),你不会引发异常。

您可以看到doc about exceptions here

答案 2 :(得分:1)

要在上述答案中添加额外的细节,您可以在 try 子句中链接 except 语句。因此,您可能首先检查 ValueError 或其他类型,然后最后您可以检查 Exception(任何尚未被 ValueError 捕获的东西)。

如上所说,ValueError继承自Exception,因此是一种更具体的Exception类型。文档:https://docs.python.org/3/library/exceptions.html

示例:

假设 mycheck() 函数传回一些异常文本,我们可以使用下面的变量“e”访问它。

try:
    value = mycheck(value)
except ValueError as e:
    print(f"'{value}' did not pass mycheck ValueCheck: {e}")
except Exception as e:
    print(f"'{value}' did not pass mycheck validation: {e}")

您询问了引发 ValueError 与引发 Exception 的区别。两者的行为相似。这是一个你想成为多么具体的问题。通常建议提出最具体的错误类型,以便为用户提供最有用的错误反馈。

如果您在我的示例中查看如何链接错误捕获,那么您可能会看到您选择引发哪种类型的错误将如何影响输出给用户。