[python] try except 예외처리

try: except:

python 은 인터프리터 언어이기 때문에 처리 도중 에러가 발생하면, 프로그램을 중단합니다. 에러가 발생하여도 프로그램을 계속 실행하려면 에러에 대한 예외처리를 해주면 됩니다.


🧩1. 인터프리터 언어란?

명령어 한 줄씩 컴파일링 되기 때문에 명령어 한 줄 한 줄이 중요하다.

  • 인터프리터는 한 줄 명령어 단위이므로 명령 한 줄이 <함수>인 경우가 많다. 그래서 인터프리터 언어를 "함수 언어"라 부르기도 합니다.
  • 명령어 한 줄이 때론 너무 단순해 보이기도 하지만 그 안의 구조는 아주 복합할 수도 있고 기능에 필요한 모든 것이 담겨 있을 수 있습니다. 
  • 인터프리터 언어가 아주 단순한 한 줄 명령어라 하더라도 객체지향성 언어만큼 체계적으로 개발될 수 있습니다.
인터프리터 언어


🧩2. try except 오류가 발생해도 실행

try문은 에러가 있어도 무조건 실행된다.

  • try except 문을 사용하면 실행 중 에러가 발생하면 except문이 실행되어 프로그램이 종료되지 않고 계속 실행됩니다.
a=['apple', 'banana', 'milk', 'juice']
b='cookie'
try:
    print('여기는 무조건 실행')
    if type(a.index(b)) is int:
        print('%s is found' % b)
except :
    print('%s does not found' % b)

#출력된 값  cookie is not found
  • 위 예제에서 try except 문이 없다면 리스트 a에 'cookie'가 없으므로 오류를 출력하며 종료된다. 
  • 에러가 발생하면 즉시 except문을 실행하므로 첫번째 print는 무조건 실행되고 두번째 print문은 실행되지 않고, 세 번째 print 명령문이 실행된다.

🧩3. except 오류명, 정해진 오류에만 실행  

특정 오류에만 except 문을 실행시킬 수 있다.

  • 0으로 나누게 되면 발생하는 오류의 이름은 'ZeroDivisionError'이고 메시지는 'division by zero'입니다. 이런 오류에만 반응하도록 예외 처리하는 방법은 다음과 같습니다.
try:
    3 / 0
except ZeroDivisionError as e:
    print(e)
#결과
division by zero
예외명 발생원인
AssertionError assert 문이 실패할 때 발생합니다.
AttributeError 어트리뷰트 참조나 대입이 실패할 때 발생합니다.
EOFError input() 함수가 데이터를 읽지 못한 상태에서 EOF (end-of-file) 조건을 만날 때 발생합니다.
GeneratorExit 제너레이터 또는 코루틴 이 닫힐 때 발생합니다.
ImportError import 문이 모듈을 로드하는 데 문제가 있을 때 발생합니다.
ModuleNotFoundError ImportError 의 서브 클래스인데, 모듈을 찾을 수 없을 때 import 가 일으킵니다.
IndexError 시퀀스 인덱스가 범위를 벗어날 때 발생합니다.
KeyError 매핑 (딕셔너리) 키가 기존 키 집합에서 발견되지 않을 때 발생합니다.
KeyboardInterrupt 사용자가 인터럽트 키(일반적으로 Control-C 또는 Delete)를 누를 때 발생합니다.
MemoryError 작업에 메모리가 부족하지만, 상황이 여전히 (일부 객체를 삭제해서) 복구될 수 있는 경우 발생합니다.
NameError 지역 또는 전역 이름을 찾을 수 없을 때 발생합니다.
NotImplementedError 이 예외는 RuntimeError 에서 파생됩니다. 사용자 정의 베이스 클래스에서, 파생 클래스가 재정의하도록 요구하는 추상 메서드나, 클래스가 개발되는 도중에 실제 구현이 추가될 필요가 있음을 나타낼 때 이 예외를 발생시켜야 합니다.
OSError([arg]) 이 예외는 시스템 함수가 시스템 관련 에러를 돌려줄 때 발생합니다.
OverflowError 산술 연산의 결과가 너무 커서 표현할 수 없을 때 발생합니다.
RecursionError 이 예외는 RuntimeError 에서 파생됩니다. 인터프리터가 최대 재귀 깊이가 초과하였음을 감지할 때 발생합니다.
ReferenceError 이 예외는 weakref.proxy() 함수가 만든 약한 참조 프락시가 이미 가비지 수집된 참조 대상의 어트리뷰트를 액세스하는 데 사용될 때 발생합니다.
RuntimeError 다른 범주에 속하지 않는 에러가 감지될 때 발생합니다.
StopIteration 이터레이터에 의해 생성된 항목이 더 없다는 것을 알려주기 위해, 내장 함수 next()와 이터레이터의 __next__() 메서드가 일으킵니다.
StopAsyncIteration 반드시 비동기 이터레이터 객체의 __anext__() 메서드가 이터레이션을 멈추고자 할 때 발생시켜야 합니다.
SyntaxError 파서가 문법 오류를 만날 때 발생합니다.
IndentationError 잘못된 들여쓰기와 관련된 문법 오류의 베이스 클래스입니다. SyntaxError 의 서브 클래스입니다.
TabError 들여쓰기가 일관성없는 탭과 스페이스 사용을 포함하는 경우 발생합니다.
SystemError 인터프리터가 내부 에러를 발견했지만, 모든 희망을 포기할 만큼 상황이 심각해 보이지는 않을 때 발생합니다. 연관된 값은 무엇이 잘못되었는지 (저수준의 용어로) 나타내는 문자열입니다.
SystemExit 이 예외는 sys.exit() 함수가 일으킵니다.
TypeError 연산이나 함수가 부적절한 형의 객체에 적용될 때 발생합니다. 연관된 값은 형 불일치에 대한 세부 정보를 제공하는 문자열입니다.
UnboundLocalError 함수 나 메서드에서 지역 변수를 참조하지만, 해당 변수에 값이 연결되지 않으면 발생합니다. 이것은 NameError 의 서브 클래스입니다.
UnicodeError 유니코드 관련 인코딩 또는 디코딩 에러가 일어날 때 발생합니다. ValueError 의 서브 클래스입니다.
UnicodeEncodeError 인코딩 중에 유니코드 관련 에러가 일어나면 발생합니다. UnicodeError 의 서브 클래스입니다.
UnicodeDecodeError 디코딩 중에 유니코드 관련 에러가 일어나면 발생합니다. UnicodeError 의 서브 클래스입니다.
UnicodeTranslateError 번역 중에 유니코드 관련 에러가 일어나면 발생합니다. UnicodeError 의 서브 클래스입니다.
ValueError 연산이나 함수가 올바른 형이지만 부적절한 값을 가진 인자를 받았고, 상황이 IndexError 처럼 더 구체적인 예외로 설명되지 않는 경우 발생합니다.
ZeroDivisionError 나누기 또는 모듈로 연산의 두 번째 인자가 0일 때 발생합니다. 연관된 값은 피연산자의 형과 연산을 나타내는 문자열입니다.

🧩4. try except else finally 구문

연산과 실행구문을 분리할 수 있습니다.

  • try : 연산구문을 넣습니다.
  • except : 예외가 발생할 때 실행할 명령문을 넣습니다.
  • else : 정상처리 되었을 때 실행할 명령문을 넣습니다.
  • finally : 구문이 종료되었음을 나타내는 명령문을 넣습니다. 항상 실행됩니다.
try:
    4 / 0
except :
    print("Error")
else :
    print("OK")
finally :
    print("수고했어")
#결과
Error
수고했어


추가 참고 자료

 파이썬 표준 라이브러리 » 내장 예외 를 참조했습니다.

 핵심만 간단히, Hello World! ... 03_더 깊게 02_예외 처리(Exception) 를 참조했습니다.

댓글 쓰기

0 댓글