Python: diferença entre o erro de valor e a excepção?
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!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
.
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.
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.
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 .