Exception von SOAP abfangen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 12. Januar 2009, 12:15

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. Januar 2009, 12:48

Guck doch mal was das ``e``-Objekt an Attributen hat (``dir(e)``), insbesondere ``e.msg``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Montag 12. Januar 2009, 12:48

Lies halt die Dokumentation und schaue nach, welche Attribute diese Ausnahme hat.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 12. Januar 2009, 13:03

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. Januar 2009, 13:25

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 12. Januar 2009, 14:31

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. Januar 2009, 15:00

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Montag 12. Januar 2009, 15:21

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
BlackJack

Montag 12. Januar 2009, 16:49

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.
zero-one
User
Beiträge: 58
Registriert: Dienstag 20. Mai 2008, 20:52

Montag 12. Januar 2009, 16:52

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. Januar 2009, 19:10

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten