파이썬 예외 처리 마스터: try, except, finally, raise 효과적 활용
파이썬 예외 처리 마스터: try, except, finally, raise 효과적 활용
파이썬 예외 처리란?
예외는 프로그램 실행 시 발생하는 에러입니다. 그러나 프로그램을 실행하는 동안 파이썬은 처리되어야 할 예외를 생성하며, 처리하지 않으면 프로그램이 크래시합니다. 파이썬에서 예외는 에러 시 자동으로 발생하거나, 코드에 의해 트리거되고 가로챌 수 있습니다.
예외는 이벤트가 발생할 수 있지만, 이런 유형의 이벤트는 드물게 발생함을 나타냅니다. 메서드가 예외를 처리할 수 없으면 호출자 함수로 던져집니다. 결국 메인 함수 밖으로 예외가 던져지면 프로그램이 갑자기 종료됩니다.
이 파이썬 예외 처리 튜토리얼에서 배울 내용:
- 파이썬 예외란?
- 예외의 일반적인 예
- 왜 예외를 사용해야 하는가?
- 예외의 규칙
- 파이썬 예외 처리 메커니즘
- 파이썬 Try 문
- 파이썬 Catch 문
- 파이썬 Raise 문
- 중요한 파이썬 에러
- 기타 중요한 파이썬 예외
- 에러 vs 예외
예외의 일반적인 예:
- 0으로 나누기
- 존재하지 않는 파일 접근
- 호환 안 되는 두 타입 더하기
- 시퀀스의 존재하지 않는 인덱스 접근
- 연결 끊긴 DB 서버에서 테이블 제거
- ATM에서 잔액보다 많은 금액 인출
왜 예외를 사용해야 하는가?
파이썬에서 예외를 사용하는 이유:
- 예외 처리로 에러 처리 코드를 정상 코드와 분리 가능.
- 예외는 에러를 나타내는 파이썬 객체.
- 코드 주석처럼, 프로그램이 기대하는 바를 상기시키는 역할.
- 코드 명확화와 가독성 향상.
- 에러 처리를 한 곳, 한 방식으로 집중시켜 결과 자극.
- 에러 메시지 처리의 편리한 방법.
- 파이썬에서
raise 예외 메서드로 프로그램에서 예외 발생 가능.
- 예외 발생으로 현재 코드 실행 중단하고 예외를 처리될 때까지 호출 스택으로 반환.
- 직접 처리할 수 없는 컴포넌트의 예외 처리.
예외의 규칙
파이썬 예외 처리의 필수 규칙:
- 예외는 클래스 객체여야 함.
- 클래스 예외의 경우, 특정 클래스를 언급하는 except 절과 함께 try 문 사용 가능.
- 문장이나 표현식이 문법적으로 올바르더라도 실행 시도 시 에러 표시 가능.
- 실행 중 발견된 에러를 예외라 하며, 무조건 치명적이진 않음.
파이썬 예외 처리 메커니즘
예외 처리는 다음 5개 키워드로 관리:
- try
- catch
- finally
- throw
파이썬 Try 문
try 문은 키워드 try, 콜론(:), 예외가 발생할 수 있는 코드 스위트로 구성. 하나 이상의 절을 가짐.
try 문 실행 중 예외가 없으면 인터프리터는 해당 try 문의 예외 핸들러를 무시.
try 스위트에서 예외 발생 시 try 스위트 만료되고 프로그램 제어가 try 스위트 뒤따르는 일치하는 except 핸들러로 이동.
문법: try: statement(s)
Catch 문
Catch 블록은 한 번에 한 인자를 받으며, 잡을 예외 타입. 이 인자는 특정 예외 타입부터 모든 예외를 잡는 잡올 카테고리까지 다양.
Catch 블록 규칙:
catch 키워드로 catch 블록 정의.
- Catch 예외 매개변수는 항상 괄호로 감쌈.
- 잡을 예외 타입을 항상 나타냄.
- 예외 처리 코드는 두 {} 중괄호 사이에 작성.
- 단일 try 블록 안에 여러 catch 블록 배치 가능.
- catch 블록은 try 블록 뒤에만 배치 가능.
- 모든 catch 블록은 서브클래스에서 슈퍼클래스 예외 순으로 정렬.
예제:
try {
} catch (ArrayIndexOutOfBoundsException e) {
System.err.printin("Caught first " + e.getMessage());
} catch (IOException e) {
System.err.printin("Caught second " + e.getMessage());
}
파이썬 Finally 문
Finally 블록은 예외 발생 여부와 상관없이 항상 실행. final 키워드로 try-catch 블록 뒤따르는 코드 블록 생성 가능.
Finally 절은 선택 사항. 모든 조건에서 실행되어야 할 정리 작업 정의 의도.
try:
raise KeyboardInterrupt
finally:
print('welcome, world!')
출력:
Welcome, world!
KeyboardInterrupt
Finally 절은 try 문 전에 실행됨.
파이썬 Raise 문
Raise 문은 예외 객체를 초기화하는 인자 지정. 예외 이름 뒤에 콤마, 그 뒤에 인자 또는 인자 튜플.
문법:
raise [Exception [, args [, traceback]]]
이 문법에서 인자는 선택 사항이며, 실행 시 예외 인자 값은 항상 none.
예제:
파이썬 예외는 문자열, 클래스, 숫자, 객체 등 어떤 값이든 될 수 있음. 파이썬 코어에서 발생하는 대부분의 예외는 인자를 가진 클래스이며, 인자는 클래스의 인스턴스.
중요한 파이썬 에러
| 에러 타입 | 설명 |
| ArithmeticError | 모든 산술 예외의 베이스 클래스. 산술 연산 에러 시 발생. |
| ImportError | 존재하지 않는 모듈 임포트 시도 시 발생. 모듈명 오타나 표준 경로에 모듈 없을 때. |
| IndexError | 범위를 벗어난 시퀀스 참조 시도 시 발생. |
| KeyError | 딕셔너리에서 특정 키를 못 찾을 때 발생. |
| NameError | 로컬/전역 네임스페이스에 없는 이름을 코드에서 참조할 때 발생. |
| ValueError | 함수나 내장 연산이 올바른 타입이지만 부적절한 값의 인자 받을 때 발생. |
| EOFError | 내장 함수(input() 등)가 데이터 읽지 않고 EOF 조건 도달 시 발생. |
| ZeroDivisionError | 모든 숫자 타입에서 0으로 나누기나 모듈로 연산 시 발생. |
| IOError | 입출력 연산 실패 시 발생. |
| SyntaxError | 파이썬 문법 에러 시 발생. |
| IndentationError | 들여쓰기가 제대로 정의되지 않았을 때 발생. |
기타 중요한 파이썬 예외
| 예외 | 설명 |
| ArithmeticException | 0으로 나누기 같은 산술 에러. |
| ArrayIndexOutOfBoundsException | 배열 인덱스 범위 초과. |
| ArrayStoreException | 호환 안 되는 타입의 배열 요소 할당. |
| ClassCastException | 잘못된 캐스팅. |
| IllegalMonitorStateException | 잠금 안 된 스레드에서 대기 같은 불법 모니터 연산. |
| IllegalStateException | 환경이나 애플리케이션이 잘못된 상태. |
| ClassNotFoundException | 클래스를 찾을 수 없음. |
| CloneNotSupportedException | Cloneable 인터페이스 미구현 객체 복제 시도. |
| IllegalAccessException | 클래스 접근 거부. |
| InstantiationException | 인터페이스나 추상 클래스 객체 생성 시도 시 발생. |
| CloneNotSupportedException | 인터페이스 미구현 객체 복제 시도. |
에러 vs 예외
| 에러 | 예외 |
| 파이썬의 모든 에러는 언체크드 타입. | 예외는 체크드와 언체크드 타입 모두 포함. |
| 컴파일러가 모르는 런타임에 발생. | try-catch 블록으로 처리해 복구 가능. |
| 주로 애플리케이션 실행 환경이 원인. | 애플리케이션 자체가 원인. |
| 예: OutOfMemoryError | 예: 체크드 예외, SQL 예외, NullPointerException 등. |
요약
- 예외는 프로그램 실행 중 발생한 에러.
- 예외는 이벤트가 발생할 수 있지만 드물게 발생함을 나타냄.
- 일반적 예외 예: 1) 0으로 나누기, 2) 존재하지 않는 파일 접근, 3) 호환 안 되는 두 타입 더하기.
- 예외는 에러를 나타내는 파이썬 객체.
- try 문: try 키워드, 콜론(:), 예외 발생 가능 코드 스위트. 하나 이상의 절.
- Catch 블록: 한 번에 한 인자, 잡을 예외 타입.
- Raise 문: 예외 객체 초기화하는 인자 지정.
- Finally 블록: 예외 발생 여부와 상관없이 항상 실행.