18 Stimmen

Wo ist die Standard-Python-Ausnahmeliste für Programme, die sie auslösen sollen?

Es gibt eine Liste Standard-Python-Ausnahmen auf die wir achten sollten, aber ich glaube nicht, dass wir sie selbst erheben sollten, denn sie sind selten anwendbar.

Ich bin neugierig, ob es eine Liste innerhalb der Standard-Python-Bibliothek gibt, mit Ausnahmen ähnlich wie bei .NET ApplicationException , ArgumentNullException , ArgumentOutOfRangeException , InvalidOperationException - Ausnahmen, die wir selbst erheben können?

Oder gibt es eine andere, mehr pythonic Weg, um häufige Fehlerfälle zu behandeln, als Auslösen von Standardausnahmen?

EDIT: Ich bin nicht auf, wie Ausnahmen zu behandeln, aber welche Arten ich kann und sollte bei Bedarf zu erhöhen.

15voto

Glenjamin Punkte 6810

Wenn der Fehler der Beschreibung einer der Standard-Python-Exception-Klassen entspricht, dann werfen Sie ihn auf jeden Fall.

Übliche Beispiele sind TypeError y ValueError Die Liste, die Sie verlinkt haben, ist bereits die Standardliste.

Wenn Sie anwendungsspezifische Funktionen benötigen, sollten Sie Exception oder einen seiner Abkömmlinge als Unterklasse verwenden.

Um auf die von Ihnen genannten Beispiele aus .NET zu verweisen ApplicationException liegt am nächsten an RuntimeError ArgumentNullException wird wahrscheinlich ein AttributeError (Versuchen Sie, die gewünschte Methode aufzurufen, und lassen Sie Python die Ausnahme a la Duck Typing auslösen) AttributeOutOfRange ist nur eine spezifischere ValueError InvalidOperationException könnte eine beliebige Anzahl von ungefähr gleichwertigen Ausnahmen aus der Python-Standardbibliothek sein.

Wählen Sie eine aus, die den Fehler widerspiegelt, den Sie auf der Grundlage der Beschreibungen in der http://docs.python.org/library/exceptions.html Seite.

14voto

S.Lott Punkte 371691

Zunächst löst Python Standardausnahmen für Sie aus.

Es ist besser, um Vergebung zu bitten, als um Erlaubnis zu fragen

Versuchen Sie einfach den Vorgang und lassen Sie Python die Ausnahme auslösen. Klammern Sie nicht alles mit if would_not_work(): raise Exception . Lohnt sich nie zu schreiben. Python tut dies bereits in alle Fälle.

Wenn Sie glauben, dass Sie eine Standardausnahme auslösen müssen, schreiben Sie wahrscheinlich zu viel Code.

Sie müssen möglicherweise die ValueError .

def someFunction( arg1 ):
    if arg1 <= 0.0:
        raise ValueError( "Guess Again." )

Von Zeit zu Zeit müssen Sie vielleicht eine TypeError aber das ist selten.

def someFunctionWithConstraints( arg1 ):
    if isinstance(arg1,float):
         raise TypeError( "Can't work with float and can't convert to int, either" )
    etc.

Zweitens wollen Sie fast immer Ihre eigenen, einzigartigen Ausnahmen schaffen.

 class MyException( Exception ): 
     pass

Das ist alles, was es braucht, um etwas Unverwechselbares und Einzigartiges für Ihre Anwendung zu schaffen.

5voto

Binary Phile Punkte 2401

Ich glaube mich zu erinnern, dass ich in der Dokumentation gelernt habe, dass es in Ordnung ist, vordefinierte Ausnahmen auszulösen, solange sie angemessen sind. Zum Beispiel ist der empfohlene Weg zur Beendigung nicht mehr der Aufruf von exit(), sondern das Auslösen von SystemExit.

Ein weiteres Beispiel ist die Wiederverwendung der IndexError-Ausnahme bei benutzerdefinierten Containertypen.

Natürlich sollte Ihre Anwendung ihre eigenen Ausnahmen definieren, anstatt Systemausnahmen wiederzuverwenden. Ich will damit nur sagen, dass es nicht verboten ist, sie wiederzuverwenden, wo es angebracht ist.

2voto

Eli Bendersky Punkte 246100

Die Python-Methode besteht darin, die Ausnahmen einfach von Python selbst durchlaufen zu lassen. Zum Beispiel, anstelle von:

def foo(arg):
  if arg is None:
    raise SomeNoneException
  bar = arg.param

Tun Sie es einfach:

def foo(arg):
  bar = arg.param

Si arg es None oder hat nicht die param Attribut, erhalten Sie eine Ausnahme von Python selbst.

In der Python glossar Dies wird als "EAFP" bezeichnet:

Es ist leichter, um Vergebung zu bitten als um Erlaubnis. Dieser übliche Python-Codierungs Stil setzt die Existenz von gültigen Schlüssel oder Attribute an und fängt Ausnahmen ab, wenn sich die Annahme als falsch ist. Dieser saubere und schnelle Stil ist zeichnet sich durch das Vorhandensein von vielen try- und except-Anweisungen. Die Technik steht im Gegensatz zum LBYL (Look Before You Leap) Stil, der in vielen anderen Sprachen üblich ist wie z.B. C.

Und es funktioniert gut im Tandem mit Pythons inhärenter Duck-Typing-Philosophie.


Das bedeutet natürlich nicht, dass Sie keine eigenen Ausnahmen erstellen sollten, sondern nur, dass Sie die bereits vorhandenen Python-Ausnahmen nicht einpacken müssen.

Für Ihre eigenen Ausnahmen, erstellen Sie Klassen, die von Exception und werfen sie, wenn es sich anbietet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X