파이썬 예외(Exception)란?
예외(exception)는 프로그램 실행 도중에 발생하여 프로그램의 정상적인 명령 흐름을 방해하는 이벤트입니다. 일반적으로 파이썬 스크립트가 스스로 처리할 수 없는 상황에 직면하면 예외를 발생(raise)시킵니다. 즉, 예외란 오류를 나타내는 하나의 파이썬 객체라고 할 수 있습니다.
파이썬 스크립트가 예외를 발생시키면 해당 예외를 즉시 처리해야 합니다. 그렇지 않으면 스크립트는 더 이상 실행되지 않고 종료됩니다.
예외 처리 방법
예외가 발생할 가능성이 있는 의심스러운 코드가 있다면, 그 코드를 try 블록 안에 배치하여 프로그램을 보호할 수 있습니다. try 블록 다음에는 except 문을 두고, 그 뒤에 문제를 최대한 우아하게 처리하는 코드 블록을 작성합니다.
기본 문법
try...except...else 블록의 기본 문법은 다음과 같습니다.
try:
여기에서 작업을 수행합니다;
......................
except ExceptionI:
ExceptionI가 발생하면 이 블록을 실행합니다.
except ExceptionII:
ExceptionII가 발생하면 이 블록을 실행합니다.
......................
else:
예외가 없다면 이 블록을 실행합니다.
위 문법에 대해 알아두어야 할 중요한 사항은 다음과 같습니다.
- 하나의 try 문에는 여러 개의 except 문을 사용할 수 있습니다. try 블록에 서로 다른 유형의 예외를 발생시킬 수 있는 문장들이 포함되어 있을 때 특히 유용합니다.
- 발생하는 모든 예외를 처리하는 범용(generic) except 절을 사용할 수도 있습니다.
- except 절(들) 뒤에는 else 절을 추가할 수 있습니다. else 블록의 코드는 try 블록의 코드가 예외를 발생시키지 않았을 때에만 실행됩니다.
- else 블록은 try 블록의 보호가 필요하지 않은 코드를 배치하기에 적합한 위치입니다.
예제 1: 정상적으로 실행되는 경우
다음 예제는 파일을 열고 내용을 작성한 뒤, 아무 문제 없이 정상적으로 종료됩니다.
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
fh.close()
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Written content in the file successfully
예제 2: 예외가 발생하는 경우
다음 예제는 쓰기 권한이 없는 파일을 열려고 시도하므로 예외가 발생합니다.
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Error: can't find file or read data
예외를 지정하지 않은 except 절
다음과 같이 예외 종류를 지정하지 않고 except 문을 사용할 수도 있습니다.
try:
여기에서 작업을 수행합니다;
......................
except:
어떤 예외든 발생하면 이 블록을 실행합니다.
......................
else:
예외가 없다면 이 블록을 실행합니다.
이러한 try-except 문은 발생하는 모든 예외를 잡아냅니다. 다만 이 방식은 모든 예외를 일괄 처리할 뿐, 발생 가능한 문제의 근본 원인을 개발자가 파악하기 어렵게 만들기 때문에 좋은 프로그래밍 습관으로는 권장되지 않습니다.
여러 예외를 한 번에 처리하는 except 절
동일한 except 문으로 여러 개의 예외를 동시에 처리할 수도 있습니다.
try:
여기에서 작업을 수행합니다;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
주어진 예외 목록 중 하나라도 발생하면
이 블록을 실행합니다.
......................
else:
예외가 없다면 이 블록을 실행합니다.
try-finally 절
finally 블록은 try 블록과 함께 사용할 수 있습니다. finally 블록은 try 블록에서 예외가 발생했는지 여부와 관계없이 반드시 실행해야 하는 코드를 넣는 곳입니다. try-finally 문의 문법은 다음과 같습니다.
try:
여기에서 작업을 수행합니다;
......................
예외가 발생하면 이 부분은 건너뛰어질 수 있습니다.
finally:
이 부분은 항상 실행됩니다.
......................
단, finally 절과 else 절은 함께 사용할 수 없습니다.
예제
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print("Error: can't find file or read data")
출력 결과
파일을 쓰기 모드로 열 권한이 없다면 다음과 같은 결과가 출력됩니다.
Error: can't find file or read data
같은 예제를 파일 닫기를 확실히 보장하는 더 깔끔한 구조로 작성하면 다음과 같습니다.
예제
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print("Going to close the file")
fh.close()
except IOError:
print("Error: can't find file or read data")
try 블록에서 예외가 발생하면 실행 흐름은 즉시 finally 블록으로 넘어갑니다. finally 블록의 모든 문장이 실행된 후에는 예외가 다시 발생하며, 상위 계층의 try-except 문에 except 절이 존재한다면 그곳에서 최종적으로 처리됩니다.
※ 참고: 본문의 예제 코드는 현재 표준인 파이썬 3 문법(print 함수 사용)을 기준으로 작성되었습니다.