Seite 1 von 1
Exception von SOAP abfangen
Verfasst: Montag 12. Januar 2009, 12:15
von Twilo
Hallo,
wie kann ich so eine Exception abfangen?
Code: Alles auswählen
Traceback (most recent call last):
[...]
File "/var/lib/python-support/python2.5/SOAPpy/Client.py", line 470, in __call__
return self.__r_call(*args, **kw)
File "/var/lib/python-support/python2.5/SOAPpy/Client.py", line 492, in __r_call
self.__hd, self.__ma)
File "/var/lib/python-support/python2.5/SOAPpy/Client.py", line 406, in __call
raise p
SOAPpy.Types.faultType: <Fault soapenv:Server.userException: com.atlassian.jira.rpc.exception.RemotePermissionException: This issue does not exist or you don't have permission to view it.: <SOAPpy.Types.structType detail at 32492648>: {'hostname': 'xyz', 'com.atlassian.jira.rpc.exception.RemotePermissionException': ''}>
wenn ich die Exception wie folgt abfange
Code: Alles auswählen
try:
...
except SOAPpy.Types.faultType, e:
print 'Exception abgefangen:', e
erhalte ich folgende Ausgabe
Code: Alles auswählen
Exception abgefangen: <Fault soapenv:Server.userException: com.atlassian.jira.rpc.exception.RemotePermissionException: This issue does not exist or you don't have permission to view it.: <SOAPpy.Types.structType detail at 32492648>: {'hostname': 'xyz', 'com.atlassian.jira.rpc.exception.RemotePermissionException': ''}>
Ich hätte gerne nur folgende Meldung: This issue does not exist or you don't have permission to view it.
ich benutze SOAPpy
mfg
Twilo
Verfasst: Montag 12. Januar 2009, 12:48
von Leonidas
Guck doch mal was das ``e``-Objekt an Attributen hat (``dir(e)``), insbesondere ``e.msg``.
Verfasst: Montag 12. Januar 2009, 12:48
von lunar
Lies halt die Dokumentation und schaue nach, welche Attribute diese Ausnahme hat.
Verfasst: Montag 12. Januar 2009, 13:03
von Twilo
Hallo,
Leonidas hat geschrieben:Guck doch mal was das ``e``-Objekt an Attributen hat (``dir(e)``), insbesondere ``e.msg``.
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__str__', '__weakref__', '_addItem', '_asdict', '_aslist', '_attrs', '_cache', '_checkValueSpace', '_data', '_fixAttr', '_getActor', '_getAttr', '_getItemAsList', '_getMustUnderstand', '_keyord', '_keys', '_marshalAttrs', '_marshalData', '_name', '_ns', '_placeItem', '_setActor', '_setAttr', '_setAttrs', '_setDetail', '_setMustUnderstand', '_type', '_typeName', '_typed', '_validNamespaceURI', '_validURIs', 'args', u'detail', 'faultcode', 'faultstring', 'message']
Code: Alles auswählen
message =
faultstring = com.atlassian.jira.rpc.exception.RemotePermissionException: This issue does not exist or you don't have permission to view it.
faultcode = soapenv:Server.userException
detail = <SOAPpy.Types.structType detail at 32754792>: {'hostname': 'xyz', 'com.atlassian.jira.rpc.exception.RemotePermissionException': ''}
lunar hat geschrieben:Lies halt die Dokumentation und schaue nach, welche Attribute diese Ausnahme hat.
welche Doku?
Auf der Jira-Seite suche ich schon seit Freitag.
Hier steht nur, welche Exception geworfen werden.
Throws:
RemotePermissionException
RemoteAuthenticationException
RemoteException
ps. warum wird die URL nicht erkannt?
wenn ich nur
URL eingebe, ist die Vorschau leer
mfg
Twilo
Verfasst: Montag 12. Januar 2009, 13:25
von Leonidas
Twilo hat geschrieben:['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__str__', '__weakref__', '_addItem', '_asdict', '_aslist', '_attrs', '_cache', '_checkValueSpace', '_data', '_fixAttr', '_getActor', '_getAttr', '_getItemAsList', '_getMustUnderstand', '_keyord', '_keys', '_marshalAttrs', '_marshalData', '_name', '_ns', '_placeItem', '_setActor', '_setAttr', '_setAttrs', '_setDetail', '_setMustUnderstand', '_type', '_typeName', '_typed', '_validNamespaceURI', '_validURIs', 'args', u'detail', 'faultcode', 'faultstring', 'message']
Code: Alles auswählen
message =
faultstring = com.atlassian.jira.rpc.exception.RemotePermissionException: This issue does not exist or you don't have permission to view it.
faultcode = soapenv:Server.userException
detail = <SOAPpy.Types.structType detail at 32754792>: {'hostname': 'xyz', 'com.atlassian.jira.rpc.exception.RemotePermissionException': ''}
Schau noch in ``args``. Wenn nicht, dann würde ich die Beschreibung aus ``faultstring`` rausholen, etwa mit ``faultstring.split(':', 1)[1].strip()``
Twilo hat geschrieben:ps. warum wird die URL nicht erkannt?
wenn ich nur
URL eingebe, ist die Vorschau leer
Weil das alte phpBB Probleme mit runden Klammern in URLs hat. Das war wohl in 2001 nicht so populär und da kaum jemand URLs richtig parst, kommt halt sowas raus.
Verfasst: Montag 12. Januar 2009, 14:31
von Twilo
Hallo,
args ist ein leeres tuple.
ich habe mir jetzt erstmal folgende Klasse erstellt
Code: Alles auswählen
class TestException(Exception):
def parseException(self, err):
self._methodName = err[1].split(':')[0].split('.')[-1]
self._message = err[1].split(':')[1].strip()
def __init__(self, err):
self.error = err
try:
self.args = err.args
self.parseException(err)
except:
raise err
def __str__(self):
return self.get_message()
def getMessage(self):
return self._message
def getMethodName(self):
return self._methodName
und erstelle mir dann damit eine Exception
Code: Alles auswählen
try:
return soap.getIssue(auth, issue_key)['status']
except SOAPpy.Types.faultType, e:
raise TestException(e)
mfg
Twilo
Verfasst: Montag 12. Januar 2009, 15:00
von Leonidas
Die Idee ist gut aber die Implementation ist Quatsch. Die Klasse würde man von der Exception erben lassen die du wrappst so dass jemand der diese SOAPPy-Exception fangen will, auch deine verbesserte Exception fängt. Außerdem wozu sind denn die Getter gut? In Python kann man durchaus direkt auf Attribute zugreifen ohne Funktions-Wrapper um die Attribute. ``parseException`` braucht auch gar nicht eine separate methode zu sein, das kann genausogut auch in ``__init__`` passieren.
Verfasst: Montag 12. Januar 2009, 15:21
von Twilo
Hallo,
Leonidas hat geschrieben:Die Klasse würde man von der Exception erben lassen die du wrappst so dass jemand der diese SOAPPy-Exception fangen will, auch deine verbesserte Exception fängt.
wie meinst du das?
Ich erbe doch von der Exceptionklasse, oder?
Leonidas hat geschrieben:Außerdem wozu sind denn die Getter gut? In Python kann man durchaus direkt auf Attribute zugreifen ohne Funktions-Wrapper um die Attribute.
das mag ich nicht so; ist aber sicherlich Geschmackssache
Leonidas hat geschrieben:``parseException`` braucht auch gar nicht eine separate methode zu sein, das kann genausogut auch in ``__init__`` passieren.
ok
mfg
Twilo
Verfasst: Montag 12. Januar 2009, 16:49
von BlackJack
Jup, ist Geschmackssache, und wer triviale Getter(/Setter) in Python verwendet, hat einen schlechten Geschmack.
So ein Getter ist einfach nur unnötiger Ballast. Sowohl bei der Laufzeit als auch beim Lesen, weil sich Python-Programmierer dann nämlich fragen, was die Methode wohl spannendes macht, denn sie muss ja irgend etwas machen, sonst hätte man auch direkt auf das Attribut zugreifen können. Oder man hat Quelltext von einem Javaprogrammierer vor sich und fragt sich was da noch für Schrecklichkeiten im Quelltext lauern mögen…
Du erbst von `Exception`, also dem Allgemeinsten was es so gibt, damit geht Information verloren.
Verfasst: Montag 12. Januar 2009, 16:52
von zero-one
ist es bei getter und settern nicht so das die in method calls gekapselt werden um die API konsitent zu halten falls es mal nicht mehr nur eine banale Zuweiung ist?
aber ich denke das entfaellt in python da man das ja dann durch properties verstecken kann ... oder ist sowas dann wiederum unschoen?
gruessle
Verfasst: Montag 12. Januar 2009, 19:10
von Leonidas
zero-one hat geschrieben:aber ich denke das entfaellt in python da man das ja dann durch properties verstecken kann ... oder ist sowas dann wiederum unschoen?
Nein, gerade das ist ja die richtige Lösung in Python.
@OP: am besten du erbst von ``SOAPpy.Types.faultType`` somit wird deine Exception von Code der ``SOAPpy.Types.faultType`` fängt auch abgefangen, weil es letztendlich nur ein Wrapper um ``SOAPpy.Types.faultType`` ist. So fliegt deine Exception durch eine solche Fehlerabfrage durch.