3.1 예외 잡기
우리가 예외에 대해 이렇게 많이 얘기하지 않을 이유는 그냥 지켜보기만 하면 되는 게 아니라서 그래. 예외는 Python 프로그램에서 처리할 수 있는 특별한 객체야. 예외 처리는 프로그램의 신뢰성과 견고성을 높일 수 있는 중요한 프로그래밍 측면이야.
Python에서는 try, except, else, finally 같은 구조를 사용해서 예외를 잡고 처리해. 이 구조를 통해 프로그램 실행 중 발생하는 오류를 잡고 적절한 조치를 취할 수 있어.
try-except 구조
try-except 구조는 예외를 잡고 처리하는데 사용돼. try 블록에는 예외를 발생시킬 수 있는 코드가 들어가고, except 블록에는 예외가 발생했을 때 실행될 코드가 들어가.
예제:
try:
result = 10 / 0
except ZeroDivisionError:
print("오류: 0으로 나누기.")
try 블록 내부의 코드에서 ZeroDivisionError 예외가 발생하면 except 블록이 그 예외를 잡고 print() 호출이 실행돼.
여러 예외 처리하기
여러 종류의 예외를 처리하고 싶다면, 각기 다른 except 블록에 명시할 수 있어.
try:
result = int("abc")
except ZeroDivisionError:
print("오류: 0으로 나누기.")
except ValueError:
print("오류: 잘못된 값.")
모든 예외 잡기
모든 예외를 잡고 싶다면, 특정 예외 타입을 명시하지 않은 except 블록을 사용할 수 있어. 하지만 이 방법은 추천하지 않아, 디버깅을 어렵게 하고 중요한 오류를 숨길 수 있거든.
try:
result = 10 / 0
except:
print("오류가 발생했습니다.")
3.2 else 와 finally 구문
try와 except 외에도 else와 finally 같은 선택사항이 있어. 지금부터 이들에 대해 좀 더 자세히 설명할게.
try-except-else 구조
else 블록은 try 블록에서 예외가 발생하지 않았을 때 코드를 실행하는 데 사용돼.
try:
result = 10 / 2
except ZeroDivisionError:
print("오류: 0으로 나누기.")
else:
print(f"결과: {result}")
try-except-finally 구조
finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 포함해. 리소스를 해제하거나 마무리 작업을 수행하는 데 유용해.
try:
result = 10 / 0
except ZeroDivisionError:
print("오류: 0으로 나누기.")
finally:
print("이 블록은 항상 실행됩니다.")
전체 예제: try-except-else-finally
예제:
try:
result = 10 / 2
except ZeroDivisionError:
print("오류: 0으로 나누기.")
else:
print(f"결과: {result}")
finally:
print("이 블록은 항상 실행됩니다.")
3.3 try-except-else-finally 예제
좀 더 큰 실제 예제를 살펴보자. 예를 들어, 디스크에서 파일을 읽으려고 할 때 — 이보다 쉬운 게 있을까?
file = open("file.txt", "r")
content = file.read()
print(content)
뭐가 잘못될 수 있을까? 예를 들면, 모든 것:
- 파일이 없을 수 있어. 실수로 삭제됐거나 기록되지 않았을 수 있고, 아니면 프로그램이 전혀 다른 컴퓨터에서 실행되고 있어서 파일이 아예 없을 수 있지.
- 파일 읽기 오류. 프로그램이 해당 파일에 대한 접근 권한이 없어서, 관리 권한이 필요한 디렉토리에 있을 수 있어.
- 다른 프로그램이 지금 그 파일에 쓰기를 하고 있어서 읽을 수 없어 — 독점 접근 권한이 다른 프로그램에 있거든.
적은 것 같아? 그렇다면, 파일 작업 중 어느 단계에서 오류가 발생하든 파일을 꼭 '닫아야' 한다는 것을 잊지 마. 그래야 운영체제가 해당 파일 작업에 할당된 리소스를 해제할 수 있어.
그래서 실제 코드는 대략 이렇게 될 거야:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("오류: 파일을 찾을 수 없습니다.")
except IOError:
print("오류: 입출력 오류.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("파일이 닫혔습니다.")
현실 세계에 온 걸 환영해. 여기서는 '정상 시나리오'만을 위한 코드뿐만 아니라 잘못될 수 있는 모든 가능성 있는 시나리오를 위한 코드도 작성해야 해.
뭐, 겁주고 싶진 않아 — 생각보다 간단해. 그냥 경계 조건(corner cases)이 무엇인지 이해하고 표준 오류를 체크하는 것을 제때 추가하면 돼. 나머지는 최신 프레임워크들이 알아서 처리해 줄 거야.
GO TO FULL VERSION