try: except:
python 은 인터프리터 언어이기 때문에 처리 도중 에러가 발생하면, 프로그램을 중단합니다. 에러가 발생하여도 프로그램을 계속 실행하려면 에러에 대한 예외처리를 해주면 됩니다.
목 차
🧩1. 인터프리터 언어란?
🧩2. try except 오류가 발생해도 실행
🧩3. except 오류명, 정해진 오류에만 실행
🧩4. try except else finally 구문
🧩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
- 모든 오류 이름은 python 공식 문서에서 찾아 볼 수 있습니다.
예외명 | 발생원인 |
---|---|
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 댓글