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 :shock:

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 :shock:
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. :P

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.