Python: Ausnahme im separaten Modul funktioniert falsch

Ich habe neue Exception-Klasse erstellt und ich gib es gerne Darstellung von Fehlern wie in OSError-Klasse. Hier ist was ich will

>>> raise(MyError(1, 'info')) MyError: [Errno 1] predefined text: info 

Was soll ich machen? Kann ich das tun, wenn ich von der Basis-Ausnahmeklasse erben werde? Hier habe ich versucht (Beispiel aus Modul für die Arbeit mit Gnulib):

 class GNULibError(Exception): '''Exception handler for GNULib classes.''' def __init__(self, errno, errinfo=None): '''Each error has following parameters: errno: code of error; used to catch error type 1: destination directory does not exist: <destdir> 2: configure file does not exist: <configure.ac> 3: selected module does not exist: <module> 4: <cache> is expected to contain gl_M4_BASE([m4base]) 5: missing sourcebase argument 6: missing docbase argument 7: missing testsbase argument 8: missing libname argument errinfo: additional info''' self.errno = errno; self.errinfo = errinfo self.args = (self.errno, self.errinfo) def __str__(self): errors = \ [ # Begin list of errors "destination directory does not exist: %s" % self.errinfo, "configure file does not exist: %s" % self.errinfo, "selected module does not exist: %s" % self.errinfo, "%s is expected to contain gl_M4_BASE([%s])" % \ (os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo), "missing sourcebase argument; cache file doesn't contain it," +" so you might have to set this argument", "missing docbase argument; you might have to create GNULibImport" \ +" instance with mode 0 and docbase argument", "missing testsbase argument; cache file doesn't contain it," +" so you might have to set this argument" "missing libname argument; cache file doesn't contain it," +" so you might have to set this argument", "dependencies and testflag 'default' cannot be used together", ] # Complete list of errors if not PYTHON3: self.message = (b'[Errno %d] %s' % \ (self.errno, errors[self.errno -1].encode(ENCS['default']))) else: # if PYTHON3 self.message = ('[Errno %d] %s' % \ (self.errno, errors[self.errno -1])) return(self.message) 

Es funktioniert falsch und gibt nur Fehlernamen für Python 2 und leere Zeichenfolge für Python 3. Wie bekomme ich ein solches Verhalten wie ich will? Vielen Dank!

One Solution collect form web for “Python: Ausnahme im separaten Modul funktioniert falsch”

Sie sollten __repr__ Methode anstelle von __str__ implementieren

http://docs.python.org/reference/datamodel.html#object.__repr__

Das wird funktionieren:

  class GNULibError(Exception): '''Exception handler for GNULib classes.''' def __init__(self, errno, errinfo=None): '''Each error has following parameters: errno: code of error; used to catch error type 1: destination directory does not exist: <destdir> 2: configure file does not exist: <configure.ac> 3: selected module does not exist: <module> 4: <cache> is expected to contain gl_M4_BASE([m4base]) 5: missing sourcebase argument 6: missing docbase argument 7: missing testsbase argument 8: missing libname argument errinfo: additional info''' self.errno = errno; self.errinfo = errinfo self.args = (self.errno, self.errinfo) def __repr__(self): errors = \ [ # Begin list of errors "destination directory does not exist: %s" % self.errinfo, "configure file does not exist: %s" % self.errinfo, "selected module does not exist: %s" % self.errinfo, "%s is expected to contain gl_M4_BASE([%s])" % \ (os.path.join(self.errinfo, 'gnulib-comp.m4'), self.errinfo), "missing sourcebase argument; cache file doesn't contain it," +" so you might have to set this argument", "missing docbase argument; you might have to create GNULibImport" \ +" instance with mode 0 and docbase argument", "missing testsbase argument; cache file doesn't contain it," +" so you might have to set this argument" "missing libname argument; cache file doesn't contain it," +" so you might have to set this argument", "dependencies and testflag 'default' cannot be used together", ] # Complete list of errors if not PYTHON3: self.message = (b'[Errno %d] %s' % \ (self.errno, errors[self.errno -1].encode(ENCS['default']))) else: # if PYTHON3 self.message = ('[Errno %d] %s' % \ (self.errno, errors[self.errno -1])) return(self.message) 
  • Wie schreibe ich ein Python 2.6+ Skript, das anmutig mit älteren Python scheitert?
  • Wie benutzt man eine benutzerdefinierte Vergleichsfunktion in Python 3?
  • Time.time vs. timeit.timeit
  • Wörterbücher sind in Python 3.6+ bestellt
  • Warum wird das Compiler-Paket in Python 3 eingestellt?
  • Regulärer Ausdruck, um Text zwischen Klammer zurückzugeben
  • Bekomme nth Zeile von String in Python
  • Hinzufügen von optionalen Parametern zu den Konstruktoren von mehrfach vererbten Unterklassen von eingebauten Typen?
  • Wie berechne ich die md5-Prüfsumme einer Datei in Python?
  • Dynamisch __slots__ in Python 3 ändern
  • QTableView in pyqt5 sortieren
  • Python ist die beste Programmiersprache der Welt.