본문 바로가기
목차
Python

[Py] Debug: Error and Exception.

by ds31x 2024. 9. 25.
728x90
반응형
BaseException에서
"개발자가 처리할 수 있는 예외들인 Exception"
이외의 예외들 (Keyboard Interrupt, SystemExit, GeneratorExit)
일반적인 프로그램 오류라기보다,
프로그램 실행 흐름 자체를 중단하거나 제어하기 위한 예외임.
이 문서에서 exception은 예외를 의미하고
Exception은 Python에서 프로그래머가 일반적으로 다루는 예외를 추상화한 클래스를 의미함.

1. Exception

Python의 경우, Exception은 개발자가 일반적으로다룰 수 있는 예외들의 상위 클래스.

exception: 영어로 “예외”, “특별한 경우”,
또는 “일반 규칙에서 벗어난 것”을 의미.

 

Python 프로그램에서 예외(exception)

  • 정상적인 흐름에서 벗어난 상황을 뜻하며,
  • 반드시 Error(명백한 코드의 오류)를 의미하지는 않음.
  • 개발자가 처리할 수 있는 예외(exception)는 Exception 클래스로 추상화,
  • 이를 포함한 Python에서 발생하 모든 예외는 BaseException 클래스로 추상화 (이 문서의 아래 참고할 것)

예외(exception)는
정상적인 프로그램 흐름에 벗어난 특별한 예외적인 상황을 가르키며,
프로그래머의 명백한 오류(Error) 뿐 아니라,
일반적인 흐름과 다른 예외상황들을 포함.

 

즉, Exception BaseException의 하위 클래스이며,
대부분의 일반적인 예외 처리에서는 BaseException이 아니라 Exception을 대상으로 처리함.

try:
    ...
except Exception as e:
    ...

위와 같이 작성하면 대부분의 일반적인 error와 exception을 처리할 수 있음.

 

반면 다음 예외들은 Exception이 아니라 BaseException을 직접 상속함.

  • SystemExit
  • KeyboardInterrupt
  • GeneratorExit

이들은 일반적인 프로그램 오류라기보다
프로그램 종료, 사용자 interrupt, generator 종료와 같은 특수한 실행 흐름 제어에 가까움.

 

예외(exception)로는 다음과 같이 나누어 볼 수 있음.

  • Error 계열: 
    • 프로그램 실행 중 실제 문제를 일으키는 예외상황.
    • SyntaxError, TypeError, ValueError, ZeroDivisionError 등 다양한 에러들이 해당
    • 주로 개발자의 실수나 코드 오류, 사용자의 입력 오류 등으로 인해 발생하는 예외
  • Warning:  DeprecationWarning 이나 SyntaxWarning 등.
    • Warning은 잠재적 문제를 경고하기 위한 Exception의 하위 클래스. 
    • Python에서는 경고 메시지 형태로 처리(warnings 모듈이 이용됨)되며 일반 Error계열의 Exception의 경우와 달리 프로그램을 종료시키지 않음.
    • DeprecationWarning, SyntaxWarning과 같은 경고들은 코드를 수정해야 할 가능성은 있음을 알리는 용도.
    • Warning 클래스 자체는 Exception의 하위 클래스이므로 try-except로 잡을 수 있음.
      • 다만 일반적인 warnings.warn()은 예외를 발생시키지 않고 경고를 출력하는 방식이므로,
      • try-except로 잡으려면 warning filter를 error로 설정해야 함
  • Iteration-related exceptions (StopIteration, GeneratorExit): 반복루프와 generator의 lifecycle 제어 (특히, 종료시점 파악용)를 위해 사용됨.
    • 반복자(iterator)와 generator의 흐름 제어에 사용되는 예외. 
    • StopIteration반복이 완료되었을 때 발생하는 예외로, 주로 for 루프나 next() 함수 호출 시 반복이 끝났음을 알리는 Exception의 하위 클래스.
    • StopAsyncIteration은 asynchronous iterator의 반복 종료를 알리기 위해 사용되는 `Exception`의 하위 클래스임.
    • GeneratorExitgenerator가 닫힐 때 발생하며, close() 메서드 호출로 인해 generator가 정상 종료되었음을 나타내며 BaseException을 직접 상속함.
  • User or program termination related exceptions :
    • 사용자 중단 요청이나 프로그램 종료 요청과 관련된 특수 예외.
    • KeyboardInterrupt는 사용자가 키보드에서 Ctrl+C를 눌러 프로그램을 중단할 때 발생하는 BaseException의 하위 클래스.
    • SystemExitsys.exit() 호출 시 발생하는 예외로, 프로그램을 정상적으로 종료하기 위해 사용되는 BaseException의 하위 클래스.
  • Assertions and Resource Issues (AssertionError, MemoryError):
    • assert 문의 조건이 거짓일 때 발생: AssertionError
    • 컴퓨팅 자원 관련된 Exception으로 메모리 할당 실패와 같은 자원 부족 상황에서 발생: MemoryError
    • 둘 다 Exception의 하위 클래스임.

2. Error

프로그램이 문제를 일으킨 상태를 설명할 때 주로 사용되는 용어.
(정상에서 벗어났다는 점은 Exception과 유사하나, Error는 문제를 일으킨다고 생각하면 됨)

 

Error는 사전적으로 “실수”, “잘못”, “오류”를 의미.

컴퓨터 프로그램에서 에러(Error)
프로그램이 기대하는 동작을 하지 못하고,
문제를 일으키는 상태를 나타냄.

 

Python에서 Error로 끝나는 Exception 클래스들
명확한 프로그래밍 오류 또는 시스템 오류 와 관련이 있으며

  • 대부분 개발자의 코드가 잘못된 방식으로 작성되었거나,
  • 사용자의 잘못된 유효하지 않은 입력과 같은 
  • 코드의 정상적 동작이 불가한 경우에 해당함.

Error 라는 이름이 뒤에 붙은 예외 클래스
Python에서 프로그래머가 고려하고 처리해야 할 (~Exception)
문제를 일으키는 중요한 오류를 의미.

 

개발자의 책임으로 일반적으로 여겨지는 Error 는 크게 다음의 두 종류임.

  • Syntax Error
  • Logical Error (~Bug)

2-1. 문법적 에러 (Syntax Error)

  • source code가 해당 프로그래밍 언어의 문법에 어긋나는 경우 발생.
  • compiler 또는 interpreter 가 에러정보 출력

2-2. 논리적 에러

  • 프로그래머가 알고리즘을 잘못 만들 경우.
  • 프로그램 실행 전에 미리 알기 어려움.
  • 프로그램 실행시 오동작
  • 많은 경우, 이 논리적 에러를 bug(버그)라 부름
  • debugging(디버깅) : 버그를 찾아 고치는 과정

3. Python 의 Exception 과 Error.

Python의 예외 클래스 계층은 다음과 같은 구조를 가지고 있음:

붉은 색은 Critical Exceptions에 속하며, 프로그래머가 일반적으로 다루는 예외는 Exception 클래스에 속함.

더보기
Python에서 Exception 상속 관계
  • BaseException
    • SystemExit
    • KeyboardInterrupt
    • GeneratorExit
    • Exception (가장 일반적으로 프로그래머가 처리하는 대부분의 예외를 추상화한 클래스)
      • ArithmeticError (수학 관련 오류)
        • ZeroDivisionError
        • OverflowError
        • FloatingPointError
      • LookupError (데이터 조회 관련 오류)
        • IndexError
        • KeyError
      • ValueError (잘못된 값 관련 오류)
      • TypeError (잘못된 유형 관련 오류)
      • OSError (운영 체제 관련 오류)
        • FileNotFoundError (파일을 찾을 수 없을 때 발생)

3-1. BaseException 클래스

  • Python의 모든 예외에 대한 최상위 클래스.
  • Python에서 발생하는 모든 예외는 BaseException 클래스를 상속받음.
  • 따라서, 모든 예외는 BaseException의 인스턴스라고 할 수 있음.
  • 일반적인 사용자 정의 예외 클래스는 더 구체적인 Exception 클래스를 상속받아 사용하는 것이 일반적.

3-2. Exception 클래스

  • Exception 클래스는 BaseException을 상속한 클래스.
  • 일반적으로 프로그래머가 처리할 수 있는 error(오류)와 exception(예외)를 의미.
  • 대부분의 사용자 정의 예외와 표준 예외는 Exception 클래스를 상속.
  • try-except 블록에서 발생할 수 있는 거의 모든 예외는 Exception을 잡아 처리.
  • 예를 들어, ZeroDivisionError, ValueError 등의 예외들은 모두 Exception의 하위 클래스임.

3-3. Exception 이 아닌 특수한 예외 

  • SystemExit, KeyboardInterrupt, GeneratorExit와 같은 예외들은 Exception이 아닌 BaseException을 직접 상속.
  • 일반적인 프로그램 오류라기보다, 프로그램 실행 흐름 자체를 중단하거나 제어하기 위한 예외  
    • SystemExit: sys.exit() 함수가 호출될 때 발생하는 예외.
    • KeyboardInterrupt: 사용자가 프로그램 실행을 중단하기 위해 Ctrl + C를 누를 때 발생하는 예외.
    • GeneratorExit: 제너레이터가 종료될 때 발생하는 예외.
  •  이런 예외들은 일반적으로 프로그래머가 처리하지 않음.

3-4. Error

  • Python에서 Error특정 예외의 이름에 자주 사용되지만, 독립적인 클래스는 아님.
  • Error는 보통 특정 유형의 예외에 대한 이름으로 사용됨.
  • 예를 들어, ZeroDivisionError, TypeError, ValueError 등은 모두 Exception의 서브클래스.
  • 따라서 Error예외의 한 유형일 뿐, 별도의 상위 클래스는 아님에 유의할 것.

같이보면 좋은 자료들

2023.10.06 - [분류 전체보기] - [Python] Python 정리

 

[Summary] Python 정리

Programming Language and Python 소개2023.10.23 - [Python] - [Python] Programming Language and Introduction of Python. [Python] Programming Language and Introduction of Python.Computer and Programhttps://dsaint31.tistory.com/436: computer 의 정의와 pr

ds31x.tistory.com

 

https://dsaint31.tistory.com/526

 

[Python] Exception 처리

1. Exception 발생 시 기본 동작Python에서 무엇인가가 잘못된 경우, python interpreter는 exception을 발생시킴.Exception : 동작을 중단시키는 에러를 가르킴.Exception handling : Exception 처리라고도 불리며, 발생

dsaint31.tistory.com


 

728x90

'Python' 카테고리의 다른 글

[Py] 사칙연산 구현 예제  (0) 2024.11.13
[ML] Classic Regressor (Summary) - regression  (0) 2024.10.02
[Py] Debugging: pdb and ipdb  (0) 2024.09.25
[Py] assert 구문 (statement)  (1) 2024.09.24
[CV] cv2.calibrateCamera  (1) 2024.09.22