6

Greenlet を生成し、callable にリンクしました。しばらくして、Greenlet は例外で失敗します。リンクされた callable が呼び出されます。それはすべて素晴らしいです!

問題は次のとおりです。

ご想像のとおり、例外のトレースバックがコンソールに表示されます。しかし、リンクされた呼び出し可能オブジェクト内でそのトレースバックを処理したいと考えています。リンクされた呼び出し可能オブジェクト内でそのトレースバックにアクセスするにはどうすればよいですか?

(私の最初の本能は を使用するtraceback.extract_stack()ことでしたが、例外ではなく、リンクされた callable 自体のトレースバックを提供することが判明しました。)

4

4 に答える 4

17

Greenlet が終了すると、トレースバックは意図的に保存されません。保存された場合、削除されることが予想される多くのオブジェクトが生きたままになります。これは、オブジェクトがリソース (開いているファイルまたはソケット) を管理している場合に特に重要です。

トレースバックを保存したい場合は、自分で行う必要があります。

于 2012-02-14T07:44:37.487 に答える
2

を使用した Stephen Diehl のソリューションの代替として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)
于 2016-10-11T13:06:49.317 に答える
1

exceptionGreenlet の値を取得して Greenlet の外に投げることを確認してください。たとえば、get返された値を返すか、内部例外を発生させます。

import traceback
import gevent

def fail():
    return 0/0

gl = gevent.spawn(fail)

try:
    gl.get()
except Exception as e:
    stack_trace = traceback.format_exc() # here's your stacktrace

必要なものを与える必要があります。

于 2012-02-13T22:38:33.570 に答える
1

Greenletオブジェクトには、確認exceptionできるプロパティが必要です。

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

于 2012-02-13T22:24:21.263 に答える