개념 사전 · 개념
Python 예외 처리
파이썬 예외 · Python 예외 처리
예외는 실행 중 실패를 객체와 호출 경로로 표현하고 처리 가능한 계층까지 전달하는 제어 흐름이다. except는 실패를 구분해 대응하고 finally·with는 성공과 실패 양쪽에서 필요한 자원 정리를 표현한다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 형식 오류·파일 오류·접속 오류를 구분해 전달한다.
- 호출 경로와 원인 연결을 보존하여 실패 지점을 설명한다.
- 자원 정리·제한된 재시도·결과 불명 처리를 정상 로직과 연결한다.
02어떤 순서로 동작하나
- 실패 발생
연산이 계약을 만족하지 못하면 해당 예외 객체와 traceback이 만들어진다.
- 처리기 탐색
현재 의 적합한 except를 찾고 없으면 호출자 방향으로 전파한다.
- 복구 또는 재발생
해당 계층에서 해결할 실패만 처리하고 필요하면 raise 또는 raise ... from ...으로 원인을 유지하며 전달한다.
- 자원 정리
구조를 빠져나갈 때 finally나 의 정리 경로를 수행하고 원래 반환·전파를 이어간다.
03먼저 알아둘 용어와 구성요소
- 예외들은 클래스 상속 계층을 이루고 except SomeError는 그 클래스 또는 하위 클래스의 인스턴스를 처리한다.
- 아래의 KeyboardInterrupt와 SystemExit 등은 일반 Exception과 구분되므로 무조건 bare except로 삼키면 종료 요청까지 무시할 수 있다.
- 의 문장을 순서대로 실행하다 예외가 생기면 남은 문장을 건너뛰고 맞는 except로 이동한다.
- 예외가 없으면 else를 수행하며 finally는 해당 구조를 빠져나갈 때 정리 작업을 수행한다.
- raise NewError(...) from exc는 바깥 계층에 맞는 오류를 만들면서 원래 원인을 명시적으로 연결한다. 예를 들어 파일을 읽는 저수준 OSError를 설정 로딩 실패라는 프로그램 의미로 감싸되 원래 경로·원인 추적을 유지하는 방식이다.
- with를 지원하면 로 수명을 표현하고, 그렇지 않으면 생성 성공 뒤 /finally에 close를 둔다.
LEARN THROUGH PRACTICE
객체 식별자와 실행 중 예외를 실제 출력으로 구분하기
실행 결과가 무엇을 증명하는지 한정하고, 값의 동일성·객체 정체성·예외 발생 지점을 따로 읽는다.
실습 구성과 전제
- 정수 대입 스크립트와 문자열 검색 셀은 별도 실험이다. 같은 커널의 연속 실행으로 가정하지 않는다.
- 구현과 실행 방식에 따라 상수 재사용은 달라질 수 있다. 화면의 id 숫자를 다른 컴퓨터에서 재현할 필요는 없다.
같은 값과 같은 객체를 나누어 읽는다
- ==는 값 비교이고 is는 객체 정체성 비교다. id는 객체가 살아 있는 동안 유지되는 식별자다.
- 캡처의 각 스크립트 실행에서는 같은 정수 리터럴이 동일 객체로 재사용된 것으로 읽을 수 있다. 이것을 모든 큰 정수에 보장되는 언어 규칙으로 일반화하지 않는다.
원본 크기로 보기 ↗- 257을 두 이름에 대입한 실행에서 두 id 출력이 같다.
- 1000으로 바꾼 별도 실행에서도 두 id는 같지만 앞 실행의 숫자와는 다르다.
확인 기준구현·버전·실행 파일 또는 셀 경계를 기록하고, 실제 값 비교에는 ==를 사용한다.
문법을 통과한 뒤 실패한 호출을 찾는다
- 문자열 index는 지정 범위에서 처음 일치한 위치를 반환하고 없으면 ValueError를 발생시킨다. end는 포함되지 않는다.
- 사진에는 앞의 세 호출 출력이 있으므로 해당 셀은 실행을 시작했다. 네 번째 호출의 런타임 예외를 구문 분석 실패와 구별한다.
원본 크기로 보기 ↗- 출력 0, 8, 5 다음에 ValueError: substring not found가 나타난다.
- 화살표는 index('s', 3, 5) 호출을 가리킨다. 위치 5는 이 검색 범위에 포함되지 않는다.
확인 기준문자열 위치를 0부터 세고, start≤위치<end 조건을 직접 대입한다.
같은 조건을 작은 예제로 재확인한다
- index의 예외를 예상하고 처리하면 뒤의 검증도 계속할 수 있다. 예외 처리 없이 실행하면 실패한 호출 이후의 문장은 실행되지 않는다.
- 노트북에서는 셀을 실행한 순서에 따라 변수 상태가 달라진다. 검증할 값의 대입부터 함께 실행해 이전 셀 상태의 영향을 줄인다.
s = 'sabcdsefs' print(s.index('s'), s.index('s', 6), s.index('s', 3, 7)) try: print(s.index('s', 3, 5)) except ValueError: print('검색 범위에 없음')관찰한 세 위치와 예외 조건을 한 번에 재구성한 예제다.
확인 기준0 8 5와 범위 없음이 나오는지 확인한다. 객체 id의 특정 숫자는 성공 기준에 넣지 않는다.
실습에서 확인한 동작 원리
- 실행 출력은 그 실행 조건의 증거이며 구현별 최적화까지 언어의 보편 규칙으로 만들지 않는다.
- 앞선 출력과 traceback 위치를 함께 보면 파싱·실행·예외 처리 중 어느 단계에서 멈췄는지 설명할 수 있다.
04예제로 따라가기
- int('70000')은 형식 변환에는 성공하므로 포트 번호처럼 허용 범위가 있는 업무에서는 별도 범위 검사가 필요하다.
- except Exception을 구체적 ValueError보다 먼저 두면 하위 타입 처리기가 실행될 기회를 잃을 수 있다.
- 외부 계정 생성 요청이 timeout이면 서버에서 이미 수행됐는지 모를 수 있어 빈 결과나 확정 실패로 숨기지 않고 상태 조회 후 재시도를 판단한다.
05혼동하기 쉬운 점과 확인 기준
- finally에서 return하거나 새 예외를 발생시키면 원래 결과·예외를 가릴 수 있어 정리 코드에는 이런 동작을 신중하게 둔다.
- 자료가 정말 0건인 경우와 조회가 실패해 빈 목록을 반환한 경우를 구별한다. 빈 값을 정상값으로 선택하려면 호출 계약에 그 의미를 명시해야 한다.
- 외부 변경 요청이 시간 초과되면 요청이 미실행인지 이미 반영됐는지 로컬 예외만으로 확정하지 못할 수 있다. 결과 불명 상태를 성공·실패와 별도로 남긴다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.