как захватить трассировку в Gevent - PullRequest
6 голосов
/ 14 февраля 2012

Я породил Гринлет и связал его с вызываемым. Некоторое время спустя, Гринлет терпит неудачу с исключением. Связанный вызов вызывается. Это все здорово!

Вот проблема:

Как и следовало ожидать, на моей консоли отображается трассировка для исключения. Но я хочу сделать что-то с этим отслеживанием в связанном вызове. Как получить доступ к этой трассировке в связанном вызываемом файле?

(Моим первым инстинктом было использование traceback.extract_stack(), но оказалось, что он обеспечивает трассировку самого связанного вызываемого объекта, а не исключения.)

Ответы [ 4 ]

16 голосов
/ 14 февраля 2012

Трассбек намеренно не сохраняется после смерти Гринлета.Если он будет сохранен, он будет поддерживать множество объектов, которые, как ожидается, будут удалены, что особенно важно, если объект управляет каким-либо ресурсом (открытым файлом или сокетом).должен сделать это сам.

1 голос
/ 11 октября 2016

В качестве альтернативы решению Стивена Дила с использованием Greenlet.link_exception.

import traceback

import gevent

def job():
    raise Exception('ooops')

def on_exception(greenlet):
    try:
        greenlet.get()
    except Exception:
        err = traceback.format_exc()
        # Do something with `err`

g = gevent.spawn(job)
g.link_exception(on_exception)
1 голос
/ 14 февраля 2012

Просто убедитесь, что вы взяли значение exception Гринлета и выбросили его за пределы Гринлета, например, get вернет либо возвращенное значение, либо вызовет внутреннее исключение.Вы то, что вам нужно.

1 голос
/ 14 февраля 2012

Объект Greenlet должен иметь свойство exception, на которое вы можете посмотреть:

http://www.gevent.org/gevent.html#gevent.Greenlet.exception

...