2017-04-25 3 views
3

Ich versuche zu verstehen, was ein Unterschied zwischen dem Erhöhen eines ValueError und einer Exception ist. Ich habe beide im selben Code (sogar im selben Zweig) versucht und das Ergebnis war das gleiche - ich habe eine Fehlermeldung erhalten.Python: Unterschied zwischen ValueError und Exception?

Ich habe diese Frage zu SO recherchiert, aber keine Diskussion dazu gefunden. Dann las ich die Dokumentation von Ausnahmen und fanden die folgende definition von Valueerror:

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 .

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

BEARBEITEN: Dank Ihrer Antworten habe ich es, was ist der Unterschied zwischen beiden Begriffen in Versuch-Ausnahme-Konstrukt. Aber wie unterscheiden sie sich, wenn sie nur erhoben werden, nicht ausgenommen?

raise Exception('blah') 

und

raise ValueError('blah') 

zu @PeterWood Answering: In beiden Fällen Ich habe gerade die Fehlermeldung "blah", aber in einem Fall war es "Ausnahme: blah", und in der zweiten: "ValueError: blah". Und ich sehe in diesem Fall keinen praktischen Unterschied zwischen beiden.

+0

Was meinst du * "die Ergebnisse ... sind die gleichen" *? Welche Ergebnisse? Du hast uns nichts gezeigt. –

+0

@PeterWood _ "Das Ergebnis war das gleiche - ich habe eine Fehlermeldung erhalten." _ –

+0

@PeterWood Ich habe meine Frage bearbeitet, bitte sehen Sie sich das an. –

Antwort

7

ValueError erbt von Exception. Sie können entscheiden, ob nur entweder ValueError oder Exception abgefangen werden soll.

In diesem Beispiel:

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

Ausnahme gefangen ist, werden alle Ausnahmen (außer BaseException Ausnahmen) von der except Anweisung gefangen.

In diesem anderen Beispiel:

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

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

Sie nur die, die im Allgemeinen bestimmte Ausnahmen zu stoppen verwenden, die wahrscheinlich auftreten (das beste Beispiel ist IOError beim Umgang mit Dateien), und den Rest nicht abgefangen lassen. 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 Nachricht unterscheidet sich, da die Darstellung der Ausnahme (wenn sie gedruckt wird) den Namen der Ausnahmeklasse enthält.

+0

Um diese Antwort zu bewerten: Sie können auch mehrere verschiedene Ausnahmen auf einmal abfangen und anders behandeln, siehe https://docs.python.org/3.5/tutorial/errors.html (suchen Sie nach '' except OSError as err: ' 'um das Beispiel zu finden, auf das ich mich beziehe. –

+0

@ Jean-François Fabre Vielen Dank für Ihre Antwort, ich verstehe. Und was ist, wenn ich ValueError oder Exception nicht annehme, sondern erhöhe? Schau dir bitte die Edit in meiner Frage an. –

0

Sie sagten es, ValueError ist eine spezifische 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, werden Sie die Ausnahme nicht erhöhen.

Sie können doc about exceptions here sehen.

Verwandte Themen