2017-04-25 83 views
3

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

我对这个问题做了一个研究,但没有发现有关这方面的讨论。然后我读异常的文档,发现ValueError异常以下definition

Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value, and the situation is not described by a more precise exception such as IndexError .

所以,按照我的理解,一个例外是一个更通用的术语,并且可以ValueError错误在某些特定情况下可以应用。但既然提出这两件事的结果是一样的,我想明白,区分ValueError和Exception的实际意义是什么。 Python版本应该在这里不相关。谢谢!

编辑: 感谢您的答案我明白了,这两个术语在try-exception构造中有什么区别。但是,在提高它们的情况下它们又有什么不同,而不是除外?

raise Exception('blah') 

raise ValueError('blah') 

回答到@PeterWood:在这两种情况下我刚刚得到了错误信息“嗒嗒”,但在一种情况下,它是“例外:胡说”,并在第二个: “ValueError:blah”。我在这种情况下看到他们俩之间没有实际的区别。

+0

你是什么意思*“结果...是相同的”*?哪个结果?你没有向我们展示过任何东西。 –

+0

@PeterWood _“结果是一样的 - 我收到了错误信息。”_ –

+0

@PeterWood我编辑了我的问题,请看看它。 –

回答

7

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

在这个例子中:

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

捕获异常,所有异常(除BaseException例外)由except声明被困。

在这个其他例如:

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

这里,异常是不是被困(TypeErrorValueError和不继承)

您通常使用特定的例外陷阱唯一有可能的那些发生时(最好的例子是IOError当处理文件),并保持其余未处理。捕获所有异常的危险是获得一段不会崩溃的代码,但什么也不做。

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

+0

要评估这个答案:你也可以一次捕获多个不同的异常,并以不同的方式处理它们,请参阅https://docs.python.org/3.5/tutorial/errors.html(搜索除OSError之外的错误: '找到我指的例子)。 –

+0

@ Jean-FrançoisFabre 谢谢你的回答,我明白了。如果我不是除ValueError或Exception之外的东西,但是提高它呢?请在我的问题编辑。 –

0

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

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

如果用int替换“hello world”,print int(42),你不会引发异常。

你可以看到doc about exceptions here

相关问题