Ich erhalte eine Warnung, dass BaseException.message in Python 2.6 veraltet ist, wenn ich die folgende benutzerdefinierte Ausnahme verwende:
class MyException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return repr(self.message)
Dies ist die Warnung:
DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
self.message = message
Was ist daran falsch? Was muss ich ändern, um die Abwertungswarnung zu entfernen?
python
exception
deprecated
trostlos
quelle
quelle
Antworten:
Lösung - fast keine Codierung erforderlich
Erben Sie einfach Ihre Ausnahmeklasse von
Exception
und übergeben Sie die Nachricht als ersten Parameter an den KonstruktorBeispiel:
Sie können
str(my)
oder (weniger elegant) verwenden,my.args[0]
um auf die benutzerdefinierte Nachricht zuzugreifen.Hintergrund
In den neueren Versionen von Python (ab 2.6) sollen wir unsere benutzerdefinierten Ausnahmeklassen von Exception erben, die ( ab Python 2.5 ) von BaseException erben. Der Hintergrund ist in PEP 352 ausführlich beschrieben .
__str__
und__repr__
sind bereits sinnvoll implementiert, insbesondere für den Fall nur eines Arguments (das als Nachricht verwendet werden kann).Sie müssen nicht wiederholen
__str__
oder__init__
implementieren oder erstellen,_get_message
wie von anderen vorgeschlagen.quelle
str
Pausen, wenn die Ausnahme mit einem Unicode-Argument erstellt wurde:str(MyException(u'\xe5'))
RaisesUnicodeEncodeError
. Die Verwendung vonunicode
anstelle vonstr
ist auch nicht kinderleicht, daunicode(MyException('\xe5'))
UnicodeDecodeError ausgelöst wird. Bedeutet dies, dass ich, wenn ich nicht im Voraus weiß, ob das Argumentstr
oder istunicode
, verwenden muss,.args[0]
wo ich es zuvor verwendet habe.message
?.message
in unserem Projekt durch.args[0]
, und das hat uns keine Probleme bereitet.Ja, es ist in Python 2.6 veraltet, weil es in Python 3.0 nicht mehr funktioniert
Die BaseException-Klasse bietet keine Möglichkeit mehr, Fehlermeldungen zu speichern. Sie müssen es selbst implementieren. Sie können dies mit einer Unterklasse tun, die eine Eigenschaft zum Speichern der Nachricht verwendet.
Hoffe das hilft
quelle
@property
Syntax aktualisieren, wenn Sie wirklich eine Kapselung benötigen.@property
, um die Verfallswarnung zu deaktivieren.Dies ist Ihre Klasse im Python2.6-Stil. Die neue Ausnahme akzeptiert eine beliebige Anzahl von Argumenten.
quelle
So replizieren Sie die Warnung
Lassen Sie mich das Problem klären, da dies nicht mit dem Beispielcode der Frage repliziert werden kann. Dadurch wird die Warnung in Python 2.6 und 2.7 repliziert, wenn Sie Warnungen aktiviert haben (über das
-W
Flag , diePYTHONWARNINGS
Umgebungsvariable oder das Warnmodul ):Hör auf zu benutzen
.message
Ich bevorzuge
repr(error)
, die eine Zeichenfolge zurückgibt, die den Namen des Fehlertyps, den Repr der Nachricht, falls vorhanden, und den Repr der verbleibenden Argumente enthält.Beseitigen der Warnung während der Verwendung
.message
Und so , wie Sie bekommen befreien von der
DeprecationWarning
ist es, eine eingebaute Ausnahme Unterklasse wie die Python - Designer gedacht:nur das
.message
Attribut ohne bekommenerror.message
Wenn Sie wissen, dass es ein Argument, eine Nachricht, für die Ausnahme gab und das ist, was Sie wollen, ist es vorzuziehen, das Nachrichtenattribut zu vermeiden und nur
str
den Fehler zu nehmen. Sagen Sie für eine UnterklasseException
:Und Verwendung:
Siehe auch diese Antwort:
Richtige Möglichkeit, benutzerdefinierte Ausnahmen in modernem Python zu deklarieren?
quelle
Soweit ich das beurteilen kann, vermeidet die einfache Verwendung eines anderen Namens für das Nachrichtenattribut den Konflikt mit der Basisklasse und stoppt somit die Verfallswarnung:
Scheint mir ein Hack zu sein.
Vielleicht kann jemand erklären, warum die Warnung ausgegeben wird, auch wenn die Unterklasse ein Nachrichtenattribut explizit definiert. Wenn die Basisklasse dieses Attribut nicht mehr hat, sollte es kein Problem geben.
quelle
In Anlehnung an die Antwort von geekQ hängt der bevorzugte Code-Ersatz davon ab, was Sie tun müssen:
Manchmal haben Ausnahmen mehr als ein Argument
my.args[0]
nicht garantiert wird, dass alle relevanten Informationen bereitgestellt werden.Zum Beispiel:
Druckt als Ausgabe:
Es ist jedoch ein kontextsensitiver Kompromiss, weil zum Beispiel:
quelle
str(my)
anstelle vonmy.message
.Der Ratschlag zur Verwendung von str (myexception) führt zu Unicode-Problemen in Python 2.7, z.
:(
funktioniert wie erwartet und wird in Fällen bevorzugt, in denen ein Teil des Inhalts der Fehlerzeichenfolge Benutzereingaben enthält
quelle
pzrqs Beitrag sagt zu verwenden:
Das war genau das, was ich brauchte.
(Wenn Sie sich in einer Unicode-Umgebung befinden, scheint Folgendes zu sein:
wird funktionieren, und es scheint in einer Nicht-Unicode-Umgebung gut zu funktionieren)
Pzrq sagte viele andere gute Sachen, aber ich habe ihre Antwort wegen all der guten Sachen fast verpasst. Da ich keine 50 Punkte habe, kann ich ihre Antwort nicht kommentieren, um auf die einfache Lösung aufmerksam zu machen, die funktioniert. Da ich keine 15 habe, kann ich diese Antwort nicht abstimmen, aber ich kann posten (fühlt sich rückwärts an, aber na ja) - also hier poste ich - wahrscheinlich Punkte dafür verlieren ...
Da es mein Ziel ist, die Aufmerksamkeit auf die Antwort von pzrq zu lenken, bitte nicht glasieren und sie in allen folgenden Abschnitten verpassen. Die ersten Zeilen dieses Beitrags sind die wichtigsten.
Meine Geschichte:
Das Problem, für das ich hierher gekommen bin, war, wenn Sie eine Ausnahme von einer Klasse abfangen möchten, über die Sie keine Kontrolle haben - was dann ??? Ich werde sicherlich nicht alle möglichen Klassen unterordnen, die mein Code verwendet, um eine Nachricht aus allen möglichen Ausnahmen herauszuholen!
Ich habe verwendet:
was, wie wir alle jetzt wissen, die Warnung gibt, nach der OP gefragt wurde (was mich hierher gebracht hat), und dies, was pzrq als eine Möglichkeit gibt, dies zu tun:
nicht.
Ich bin nicht in einer Unicode-Umgebung, aber die Antwort von jjc hat mich gefragt, also musste ich es versuchen. In diesem Zusammenhang wird dies:
was zu meiner Überraschung genau wie str (e) funktionierte - also benutze ich das jetzt.
Ich weiß nicht, ob 'str (e) / unicode (e)' der 'genehmigte Python-Weg' ist, und ich werde wahrscheinlich herausfinden, warum das nicht gut ist, wenn ich auf 3.0 komme, aber man hofft, dass die Fähigkeit, mit einem umzugehen unerwartete Ausnahme (*) ohne zu sterben und trotzdem einige Informationen daraus zu erhalten, wird niemals verschwinden ...
(*) Hmm. "unerwartete Ausnahme" - ich glaube ich stotterte nur!
quelle