Seite 1 von 1

Geworfene Exception in einem Thread abfragen

Verfasst: Mittwoch 14. Januar 2009, 12:31
von helduel
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

Verfasst: Mittwoch 14. Januar 2009, 12:51
von rayo
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

Verfasst: Mittwoch 14. Januar 2009, 13:08
von helduel
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

Verfasst: Mittwoch 14. Januar 2009, 13:14
von snafu
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>

Verfasst: Mittwoch 14. Januar 2009, 14:21
von HerrHagen
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...

Verfasst: Mittwoch 14. Januar 2009, 14:42
von snafu
Dann vielleicht sys.last_traceback?

snafu bin übrigens ich. Ich suche nicht danach. ;)

Verfasst: Mittwoch 14. Januar 2009, 14:45
von HerrHagen
Ich habe mich vertan...

Verfasst: Donnerstag 15. Januar 2009, 10:00
von helduel
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