나는 Greenlet을 생성하고 호출 가능하도록 링크했습니다. 얼마 후, Greenlet은 예외로 실패합니다. 연결된 호출 가능 객체가 호출됩니다. 그게 다야! 예상대로,gevent에서 추적 코드를 캡처하는 방법
이예외에 대한 역 추적 내 콘솔에 나타납니다
는 여기에 문제가 있습니다. 하지만 연결된 콜 가능 내에서 그 추적 표시로 일을하고 싶습니다. 연결된 호출 가능 함수 내에서 해당 추적에 대한 액세스 권한을 얻으려면 어떻게해야합니까?
나는 Greenlet을 생성하고 호출 가능하도록 링크했습니다. 얼마 후, Greenlet은 예외로 실패합니다. 연결된 호출 가능 객체가 호출됩니다. 그게 다야! 예상대로,gevent에서 추적 코드를 캡처하는 방법
이예외에 대한 역 추적 내 콘솔에 나타납니다
는 여기에 문제가 있습니다. 하지만 연결된 콜 가능 내에서 그 추적 표시로 일을하고 싶습니다. 연결된 호출 가능 함수 내에서 해당 추적에 대한 액세스 권한을 얻으려면 어떻게해야합니까?
Greenlet이 죽으면 추적 표시가 의도적으로 저장되지 않습니다. 그것이 저장 되었다면, 삭제 될 것으로 예상되는 많은 객체들을 유지할 것인데, 특히 객체가 어떤 자원 (열린 파일 또는 소켓)을 관리하는 경우에 중요합니다.
추적 코드를 저장하려면 직접해야합니다.
는 Greenlet
객체는 당신이 볼 수있는 exception
속성을 가져야한다 (나의 첫번째 본능은 그 링크 된 호출 자체가 아니라 예외에 대한 역 추적을 제공 밝혀졌습니다. traceback.extract_stack()
을 사용했지만) :
어떻게 추적 추적을 얻을 수 있습니까? – kkurian
그냥 당신이 Greenlet의 exception
값을 잡아 예를 들어, Greenlet 밖에 던져 값 중 하나를 반환 get
반환 또는 INTERNA을 제기해야합니다 나는 예외 다.
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
필요한 것을 제공해야합니다.
링크 된 호출 가능 코드 (예 : foo = gevent.Greenlet (x); foo.link_exception (bar); foo.start();
아마도 위 코드를 붙여야합니다. 문제가 범위 지정 문제로 보이고 범위를 설정하는 방법을 알면 디버깅하기가 더 쉬울 것입니다. –
Greenlet.link_exception
을 사용하는 Stephen Diehl 솔루션 대신 사용할 수 있습니다.
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)
그리고 그것은 권위있는 대답입니다. 고마워, 데니스. – kkurian