본문 바로가기
  • ▒ 네모의 쉽게 배우는 네트워크 | 개발 ▒
파이썬 개발/Qypt5

PyQt5 - GUI, Window 종료시 오류 내용 표시, 오류 정보 없는 프로그램 종료(Crash) 방지

by 너l모 2022. 9. 14.
반응형

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!


 ο 목차

     


    ※ 코드 보는 방법 참고

    ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력

    ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력

    ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력

    ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력


    안녕하세요, 네모입니다.

     

    PyQt5로 GUI 프로그램 짜면서 골치 아픈 것 중 하나가 바로 오류 없이 종료 되는 현상(crash without err message) 입니다. 

    각 파트마다 예외처리를 수동으로 해주지 않아도 어떤 오류가 발생했는지 출력할 수 있는 방법을 공유하고자 합니다.

     

    1. 문제 사례

    - 일부 코드 내 오류 발생시 에러 메세지 없이 프로그램이 종료되는 현상

     

    2. 오류 메세지 내용 상세

    - 오류 코드 예시 ↓

    Process finished with exit code -1073740791 (0xC0000409)

    - 상세 오류 내용에 대한 메세지 없이 프로세스가 종료되었다는 메세지만 표기됨.

     

    3. 문제 원인

    - PyQt5에서 처리되지 않는 파이썬의 오류가 발생하는 경우(ex. IndexError 등) Qt는 qFatal()* 함수를 호출

    * qFatal() 함수는 abort()를 호출하고 프로그램을 종료시킴.

     

    4. 문제 해결 방법

    1) 문제 해결 방법

    - 코드 내에 예외 후크(excepthook)가 있는 경우 qFatal() 함수보다 우선 동작하기 때문에 코드 내에 예외 후크를 심어두어 qFatal() 함수가 프로그램을 종료시키기 전에 에러 메세지를 출력하도록 설정

    ※ 자세한 내용은 아래 링크 참고 ↓

    https://www.riverbankcomputing.com/static/Docs/PyQt5/incompatibilities.html#unhandled-python-exceptions

     

    Incompatibilities with Earlier Versions — PyQt Documentation v5.15.4

    Execution of Python Slots In previous versions, when a signal was emitted to a Python slot that was not decorated with pyqtSlot(), it would not check that the underlying C++ receiver instance still existed. This matched the PyQt v4 behaviour at the time th

    www.riverbankcomputing.com

    2) 문제 해결 코드

    - 아래와 같이 예외 후크를 위한 함수 작성

    def ExceptionHook(exctype, value, traceback):
        sys.__excepthook__(exctype, value, traceback)
        sys.exit(1) # 이 줄은 예외 처리 후 프로그램을 종료하고 싶을 때 추가하고, 프로그램을 종료하지 않고 예외만 출력하고 싶은 경우 삭제

    - 이벤트 루프 실행 전에 예외 후크를 실행하도록 설정

    if __name__ == "__main__":
        sys.excepthook = ExceptionHook # 예외 후크 설정 부분
        app = QtWidgets.QApplication(sys.argv)
        mw = Main_Window()
        mw.show()
        sys.exit(app.exec_())

     

    4. 문제 해결 결과

    - 예외 후크 설정 후 아래와 같이 오류 메세지가 정상적으로 출력되는 것을 확인 할 수 있음

    Traceback (most recent call last):
      File "C:\Users\PycharmProjects\security_check_final\sc2.py", line 1465, in run
        self.RunSecurityCheck(self.t1, self.t2)
      File "C:\Users\PycharmProjects\security_check_final\sc2.py", line 135, in RunSecurityCheck
        self.a_val.append(aa[1])
    IndexError: list index out of range
    
    Process finished with exit code 1

     


    ※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다. 

     

     

    반응형

    댓글