Geworfene Exception in einem Thread abfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 14. Januar 2009, 12:31

Moin allerseits,

gibt es eine Möglichkeit an die Exception, die in einem Thread geworfen wurde, zu kommen?

Tritt eine Exception in einem Thread auf, dann wird zwar eine Fehlermeldung auf stderr geschrieben, aber ich will das Exception-Objekt irgendwann in der Hand haben.

Code: Alles auswählen

>>> from threading import Thread
>>> def raiser():
...     raise ValueError("Hello")
... 
>>> t = Thread(target=raiser)
>>> t.start()
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/usr/lib/python2.4/threading.py", line 422, in run
    self.__target(*self.__args, **self.__kwargs)
  File "<stdin>", line 2, in raiser
ValueError: Hello

>>> t.isAlive()
False
Nach dem isAlive weiß ich zwar, ob der Thread tot ist, aber ich weiß nicht, warum.

Gruß,
Manuel
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 14. Januar 2009, 12:51

Hi

Z.B. so:

Code: Alles auswählen

import threading

class Thread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.exception = None
        self.traceback = None
    def run(self):
        try:
            raise ValueError("Hello")
        except Exception, e:
            import traceback
            self.exception = e
            self.traceback = traceback.format_exc()

t = Thread()
t.start()

import time
time.sleep(0.5)

print 'Alive:', t.isAlive()
print 'Exception:', t.exception, repr(t.exception)
print 'Traceback:', t.traceback
Gruss
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 14. Januar 2009, 13:08

Ah, ok. Ich muss mich selbst drum kümmern. Wäre nett gewesen, wenn es sowas schon eingebaut geben würde.

Vielen Dank!

Gruß,
Manuel
Benutzeravatar
snafu
User
Beiträge: 5440
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 14. Januar 2009, 13:14

Worum musst du dich denn da kümmern? traceback.format_exc() gibt doch genau die Meldung zurück, die geworfen wurde. Oder suchst du sowas:

Code: Alles auswählen

In [1]: import sys

In [2]: try:
   ...:     raise ValueError('bla')
   ...: except ValueError:
   ...:     exctype, value, excobj = sys.exc_info()
   ...:     
   ...:     

In [3]: exctype
Out[3]: <type 'exceptions.ValueError'>

In [4]: print exctype.__name__
ValueError

In [5]: value
Out[5]: ValueError('bla',)

In [6]: print value
bla

In [7]: excobj
Out[7]: <traceback object at 0x9850234>
shcol (Repo | Doc | PyPi)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Mittwoch 14. Januar 2009, 14:21

Worum musst du dich denn da kümmern? traceback.format_exc() gibt doch genau die Meldung zurück, die geworfen wurde.
Ich glaub es ging eher darum, dass man die Exception extra abfangen muß
und das TracebackObject dann speichern. snafu suchte nach einer automatischen möglichkeit rauszufinden "woran der thread gestorben ist".
Da fällt mir allerdings auch nichts ein...
Benutzeravatar
snafu
User
Beiträge: 5440
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 14. Januar 2009, 14:42

Dann vielleicht sys.last_traceback?

snafu bin übrigens ich. Ich suche nicht danach. ;)
shcol (Repo | Doc | PyPi)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Mittwoch 14. Januar 2009, 14:45

Ich habe mich vertan...
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 15. Januar 2009, 10:00

HerrHagen hat geschrieben:Ich glaub es ging eher darum, dass man die Exception extra abfangen muß und das TracebackObject dann speichern.
Genau darum geht's.

Gruß,
Manuel
Antworten