본문 바로가기
파이썬

파이썬 Python의 호출자 스레드에서 스레드의 예외 포착

by º기록 2020. 11. 30.
반응형

저는 일반적으로 Python 및 다중 스레드 프로그래밍을 처음 접합니다. 기본적으로 파일을 다른 위치로 복사하는 스크립트가 있습니다. 스크립트가 아직 실행 중임을 나타 내기 위해 .... 를 출력 할 수 있도록 다른 스레드에 배치하고 싶습니다.

내가 가진 문제는 파일을 복사 할 수 없으면 예외가 발생한다는 것입니다. 메인 스레드에서 실행하는 경우 괜찮습니다. 그러나 다음 코드는 작동하지 않습니다.

try:
    threadClass = TheThread(param1, param2, etc.)
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"

스레드 클래스 자체에서 예외를 다시 던지려고했지만 작동하지 않습니다. 나는 여기에있는 사람들이 비슷한 질문을하는 것을 보았지만 그들은 모두 내가하려는 것보다 더 구체적인 것을하는 것 같다 (그리고 나는 제공되는 해결책을 이해하지 못한다). 사람들이 sys.exc_info () 의 사용법을 언급하는 것을 보았지만 어디서 어떻게 사용하는지 모르겠습니다.

모든 도움에 감사드립니다!

수정 : 스레드 클래스의 코드는 다음과 같습니다.

class TheThread(threading.Thread):
    def __init__(self, sourceFolder, destFolder):
        threading.Thread.__init__(self)
        self.sourceFolder = sourceFolder
        self.destFolder = destFolder

    def run(self):
        try:
           shul.copytree(self.sourceFolder, self.destFolder)
        except:
           raise

 

해결 방법

 

문제는 thread_obj.start () 가 즉시 반환된다는 것입니다. 생성 한 자식 스레드는 자체 스택과 함께 자체 컨텍스트에서 실행됩니다. 여기서 발생하는 모든 예외는 자식 스레드의 컨텍스트에 있으며 자체 스택에 있습니다. 이 정보를 부모 스레드에 전달하기 위해 지금 생각할 수있는 한 가지 방법은 일종의 메시지 전달을 사용하는 것입니다.

크기를 위해 이것을 시도하십시오 :

import sys
import threading
import Queue


class ExcThread(threading.Thread):

    def __init__(self, bucket):
        threading.Thread.__init__(self)
        self.bucket = bucket

    def run(self):
        try:
            raise Exception('An error occured here.')
        except Exception:
            self.bucket.put(sys.exc_info())


def main():
    bucket = Queue.Queue()
    thread_obj = ExcThread(bucket)
    thread_obj.start()

    while True:
        try:
            exc = bucket.get(block=False)
        except Queue.Empty:
            pass
        else:
            exc_type, exc_obj, exc_trace = exc
            # deal with the exception
            print exc_type, exc_obj
            print exc_trace

        thread_obj.join(0.1)
        if thread_obj.isAlive():
            continue
        else:
            break


if __name__ == '__main__':
    main()

 

참조 페이지 https://stackoverflow.com/questions/2829329

 

 

반응형

댓글