it-swarm.com.de

Python: Unterschied zwischen ValueError und Exception?

Ich versuche zu verstehen, was ein Unterschied zwischen der Ausgabe eines ValueError und einer Ausnahme ist. Ich habe beide im selben Code versucht (sogar im selben Zweig) und das Ergebnis war das gleiche - ich habe eine Fehlermeldung erhalten.

Ich habe zu dieser Frage zu SO recherchiert, aber keine Diskussion darüber gefunden. Dann habe ich die Dokumentation der Ausnahmen gelesen und folgende definition von ValueError gefunden: 

Wird ausgelöst, wenn eine integrierte Operation oder Funktion ein Argument empfängt, das den richtigen Typ, aber einen ungeeigneten Wert hat und die Situation nicht durch eine genauere Ausnahme wie IndexError beschrieben wird.

So wie ich es verstehe, ist eine Ausnahme ein allgemeinerer Begriff, und ValueError kann in bestimmten Fällen angewendet werden. Da jedoch die Ergebnisse beider Anhebungen gleich sind, möchte ich verstehen, was die praktische Bedeutung der Unterscheidung zwischen einem ValueError und einer Ausnahme ist. Die Python-Version sollte hier nicht relevant sein. Vielen Dank!

EDIT: Dank Ihrer Antworten habe ich es verstanden, was ist der Unterschied zwischen den beiden Begriffen in try-exception-Konstrukt. Aber wie unterscheiden sie sich, wenn sie nur erhöht werden, nicht ausgenommen?

raise Exception('blah') 

und 

raise ValueError('blah') 

Beantwortung von @PeterWood: In beiden Fällen habe ich gerade die Fehlermeldung "blah" erhalten, aber in einem Fall war es "Exception: blah" und im zweiten: "ValueError: blah". Und ich sehe in diesem Fall keinen praktischen Unterschied zwischen beiden.

6
vlad.rad

ValueError erbt von Exception. Sie können sich entscheiden, entweder nur ValueError oder Exception abzufangen.

In diesem Beispiel:

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

ausnahme gefangen, alle Ausnahmen (außer BaseException Ausnahmen) werden von der except-Anweisung abgefangen.

In diesem anderen Beispiel:

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

Hier wird die Ausnahme NICHT abgefangen (TypeError ist nicht ValueError und erbt nicht)

Im Allgemeinen verwenden Sie bestimmte Ausnahmen, um nur die zu überfangen, die wahrscheinlich auftreten (am besten ist IOError beim Umgang mit Dateien), und der Rest bleibt unaufgefordert. Die Gefahr, alle Ausnahmen zu erfassen, besteht darin, einen Code zu erhalten, der nicht abstürzt, aber nichts tut.

(Bearbeiten der Antwort als Antwort auf Ihre Bearbeitung :), wenn Sie eine Ausnahme auslösen: Sie erstellen eine Instanz von Exception, die von zukünftigen except ValueError:-Anweisungen herausgefiltert wird. Die Meldung unterscheidet sich, da die Darstellung der Ausnahme (wenn gedruckt) den Ausnahmeklassennamen enthält.

10

Sie sagten es, ValueError ist eine bestimmte Ausnahme. Ein kurzes Beispiel:

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

Wenn Sie "Hallo Welt" mit einem int, print int (42) ändern, wird die Ausnahme nicht ausgelöst.

Sie können doc über Ausnahmen hier sehen.

1
Nicolas Flores