기본 스레드의 스레드에서 도대치되지 않은 예외를 제기 하시겠습니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1854216

문제

이 질문은 이미 여기에 답이 있습니다.

비슷한 질문이 있지만 필요한 답변을 제공하는 것은 없습니다.

내가 스레드를 생성하는 경우 threading.Thread, 그런 다음 처리되지 않은 예외를 던지면 해당 스레드가 종료됩니다. 스택 추적으로 예외 세부 사항에서 기본 인쇄를 유지하고 싶지만 전체 프로세스를 중단하고 싶습니다.

나는 스레드의 모든 예외를 포착하고 기본 스레드 개체에서 reraise 또는 기본 예외 처리를 수동으로 수행 한 다음 A를 올릴 수 있다고 생각했습니다. SystemExit 메인 스레드에서.

이것에 대해 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

나는 썼다 파이썬의 예외를 다시 제외합니다, 예를 들어 이와 같은 것을 포함하여.

작업자 스레드 에서이 작업을 수행합니다 (Python 2.X, 아래 Python 3.X 버전 참조) :

try:
    self.result = self.do_something_dangerous()
except Exception, e:
    import sys
    self.exc_info = sys.exc_info()

그리고 당신의 주요 스레드에서 당신은 다음을 수행합니다.

if self.exc_info:
    raise self.exc_info[1], None, self.exc_info[2]
return self.result

예외는 마치 작업자 스레드에서 발생한 것처럼 기본 스레드에 나타납니다.

Python 3.x :

try:
    self.result = self.do_something_dangerous()
except Exception as e:
    import sys
    self.exc_info = sys.exc_info()

그리고 당신의 메인 스레드에서 :

if self.exc_info:
    raise self.exc_info[1].with_traceback(self.exc_info[2])
return self.result

다른 팁

2 차 스레드가 메인 스레드에서 안정적으로 올릴 수있는 유일한 예외는 KeyboardInterrupt: 보조 스레드가 수행하는 방식은 함수를 호출하는 것입니다. thread.interrupt_main(). 추가 정보 (예외의 이유에 대한)를 제외하는 예외 객체와 연관시키는 방법은 없습니다. 후자는 항상 평범한 것입니다. KeyboardInterrupt. 따라서 전용 인스턴스에 따라 해당 정보를 다른 곳에서 숨겨야합니다. 대기열 - 해당 정보에는 보조 스레드가 통해 얻을 수있는 결과가 포함될 수 있습니다. sys.exc_info(), 물론 유용한 다른 것들.

기본 스레드는 해당 추가 정보를 복구해야합니다 (키보드 인터럽트가 실제로 사용자가 Control-C 등을 누르기 때문에 큐가 비어 있음을 고려하십시오. get_nowait 그리고 a Queue.Empty 예를 들어, 예를 들어), 그러나 원하는 형식을 형성하고 종료합니다 (모든 보조 스레드가 악마s, 메인 스레드가 종료 될 때 전체 프로세스가 종료됩니다).

불행히도 받아 들여지는 답변은 질문에 대답하지 않습니다. 예외 세부 사항을 대기열에 파이프합니다. 다음을 살펴보십시오. Python의 발신자 스레드에서 스레드의 예외를 포착합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top