Python: diferença entre o erro de valor e a excepção?

Estou a tentar perceber qual é a diferença entre levantar um erro de valor e uma excepção. Eu tentei ambos no mesmo código (mesmo no mesmo ramo) e o resultado foi o mesmo - Eu recebi uma mensagem de erro.

Fiz uma pesquisa sobre esta questão, mas não encontrei discussão sobre isso. Então eu li A documentação das exceções, e encontrei a seguinte definição de erro de Valor:

elevado quando uma operação ou função incorporada recebe uma argumento que tem o tipo certo, mas um valor inadequado, e a situação não é descrita por uma exceção mais precisa, como IndexError.

Pelo que sei, uma excepção é um termo mais geral, e o erro de valor pode ser aplicado em alguns casos específicos. Mas como os resultados de levantar ambas as coisas são os mesmos, Eu quero entender, qual é o significado prático de diferenciar entre um erro de valor e uma exceção. A versão Python não deve ser relevante aqui. Obrigar tu!

editar : Graças às suas respostas, Qual é a diferença entre ambos os Termos na construção de tentativa de exceção. Porém, como poderão diferir, se não forem ressuscitados?

raise Exception('blah') 

e

raise ValueError('blah') 

respondendo a @PeterWood: em ambos os casos recebi a mensagem de erro "blah", mas num caso era "excepção: blah", e no segundo: "erro de valor: blah". E, neste caso, não vejo diferença prática entre ambos.

Author: vlad.rad, 2017-04-25

2 answers

ValueError herda de Exception. Você pode decidir encurralar apenas ValueError, ou Exception, é para isso que serve a herança de exceção.

Neste exemplo:

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

A excepção está presa, todas as excepções (excepto BaseException estão presas pela declaração except.

Neste outro exemplo:

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

Aqui, a excepção não está presa (TypeError não é ValueError e não herda)

Geralmente usa excepções específicas para prender apenas os que são provável de ocorrer (o melhor exemplo é IOError ao lidar com ficheiros), e deixar o resto sem armadilhas. O perigo de pegar todas as exceções é obter um pedaço de código que não cai, mas não faz nada.

(editar a resposta em resposta à sua edição:) quando você levanta uma excepção: você está a criar uma instância de Exception que será filtrada por declarações futuras except ValueError:. a mensagem é diferente porque a representação da exceção (quando impressa) inclui a classe de exceção nome.

 8
Author: Jean-François Fabre, 2017-04-25 09:23:58
Disseste - o, o erro de valor é uma excepção específica. Um pequeno exemplo:
try:
    print int("hello world")
except ValueError:
    print "A short description for ValueError"

Se você mudar "hello world" com um int, print int(42), Você não levantará a exceção.

Você pode ver doc sobre exceções aqui .

 1
Author: Nicolas Flores, 2017-04-25 08:46:23