meldung - type error python beispiel




Mehrere Ausnahmen in einer Zeile abfangen(außer Block) (5)

Wie fange ich mehrere Ausnahmen in einer Zeile (außer Block)

Mach das:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

Die Klammern sind aufgrund der älteren Syntax erforderlich, die das Fehlerobjekt mithilfe von Kommas einem Namen zuweist. Das Schlüsselwort as wird für die Zuordnung verwendet. Sie können einen beliebigen Namen für das Fehlerobjekt verwenden, ich bevorzuge den error persönlich.

Beste Übung

Um dies derzeit und vorwärtskompatibel mit Python zu tun, müssen Sie die Exceptions durch Kommas trennen und sie in Klammern einschließen, um sie von der früheren Syntax zu unterscheiden, bei der die Exceptioninstanz einem Variablennamen zugeordnet wurde Komma.

Hier ist ein Beispiel für die einfache Verwendung:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

Ich spezifiziere nur diese Ausnahmen, um das Ausblenden von Fehlern zu vermeiden, von denen ich ausgehen kann, dass ich die vollständige Stapelverfolgung erwarte.

Dies ist hier dokumentiert: https://docs.python.org/tutorial/errors.html

Sie können die Ausnahme einer Variablen zuweisen ( e ist üblich, aber Sie können eine ausführlichere Variable bevorzugen, wenn Sie über lange Ausnahmebehandlung verfügen oder Ihre IDE nur größere Auswahlen hervorhebt, als meine.) Die Instanz verfügt über ein args-Attribut. Hier ist ein Beispiel:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

Beachten Sie, dass das err Objekt in Python 3 außerhalb des Gültigkeitsbereichs liegt, wenn der except Block abgeschlossen ist.

Veraltet

Möglicherweise sehen Sie Code, der den Fehler mit einem Komma zuweist. Diese Verwendung, das einzige in Python 2.5 und früheren Versionen verfügbare Formular, ist veraltet. Wenn Sie möchten, dass Ihr Code in Python 3 vorwärtskompatibel ist, sollten Sie die Syntax aktualisieren, um das neue Formular zu verwenden:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

Wenn Sie in Ihrer Codebase die Zuweisung von Kommas Namen sehen und Python 2.5 oder höher verwenden, wechseln Sie zu der neuen Methode, damit Ihr Code beim Upgrade weiterhin kompatibel ist.

Der suppress Kontextmanager

Die akzeptierte Antwort besteht aus mindestens 4 Zeilen Code:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Die try Testzeilen können mit dem in Python 3.4 verfügbaren Kontextkontextmanager in einer einzigen Zeile behandelt werden:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Wenn Sie also bestimmte Ausnahmen weitergeben möchten, verwenden Sie suppress .

Ich weiß, dass ich kann:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Ich kann das auch tun:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

Aber wenn ich dasselbe mit zwei verschiedenen Ausnahmen tun möchte, kann ich mir das am besten vorstellen:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

Gibt es eine Möglichkeit, dass ich so etwas tun kann (da die Aktion, die in beiden Ausnahmen durchgeführt werden soll, say please ):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

Jetzt funktioniert das wirklich nicht, da es der Syntax entspricht:

try:
    # do something that may fail
except Exception, e:
    # say please

Meine Bemühungen, die zwei unterschiedlichen Ausnahmen zu erfassen, kommen also nicht gerade durch.

Gibt es eine Möglichkeit, dies zu tun?


In der Dokumentation zu Python 2.7 heißt es:

Eine try-Anweisung kann mehrere Exceptionsklauseln enthalten, um Handler für verschiedene Exceptions anzugeben. Es wird höchstens ein Handler ausgeführt. Handler behandeln nur Ausnahmen, die in der entsprechenden try-Klausel auftreten, nicht in anderen Handlern derselben try-Anweisung. Eine Exceptionsklausel kann mehrere Ausnahmen als Tupel in Klammern benennen, zum Beispiel:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Beachten Sie, dass die Klammern um dieses Tupel erforderlich sind, da mit Ausnahme von ValueError die Syntax für das war, was normalerweise als geschrieben wird, mit Ausnahme von ValueError als e: in modernem Python (unten beschrieben). Die alte Syntax wird aus Gründen der Abwärtskompatibilität weiterhin unterstützt. Dies bedeutet mit Ausnahme von RuntimeError, dass TypeError nicht mit Ausnahme von (RuntimeError, TypeError): äquivalent ist, sondern mit der Ausnahme, dass RuntimeError als TypeError: ausgenommen ist.


Aus der Python-Dokumentation :

Eine Exceptionsklausel kann beispielsweise mehrere Exceptions als ein in Klammern stehendes Tupel benennen

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

Oder nur für Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

Das Trennen der Ausnahme von der Variablen durch ein Komma funktioniert weiterhin in Python 2.6 und 2.7, ist aber jetzt veraltet und funktioniert nicht in Python 3. Jetzt sollten Sie als verwenden.


Einer der Wege dies zu tun ist ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

Eine andere Möglichkeit besteht darin, eine Methode zu erstellen, die eine Aufgabe ausführt, die von except -Block ausgeführt wird, und es durch den gesamten von Ihnen beschriebenen Block aufrufen.

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

Ich weiß, dass der zweite nicht der beste Weg ist, dies zu tun, aber ich zeige nur eine Anzahl von Möglichkeiten, um dieses Ding zu machen.


Wenn Sie häufig eine große Anzahl von Ausnahmen verwenden, können Sie ein Tupel vordefinieren, sodass Sie diese nicht mehrmals eingeben müssen.

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

ANMERKUNGEN:

  1. Wenn Sie auch andere Ausnahmen als die im vordefinierten Tupel abfangen müssen, müssen Sie einen weiteren Ausnahmeblock definieren.

  2. Wenn Sie eine globale Variable nicht tolerieren können, definieren Sie sie in main () und übergeben Sie sie, wenn nötig ...





exception-handling