PyQt5 - GUI, Window 종료시 오류 내용 표시, 오류 정보 없는 프로그램 종료(Crash) 방지
※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :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() 함수가 프로그램을 종료시키기 전에 에러 메세지를 출력하도록 설정
※ 자세한 내용은 아래 링크 참고 ↓
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
※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다.