Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 예외(Exception)란 무엇일까? try-except로 배우는 예외 처리 완벽 가이드

파이썬 예외(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 함수 사용)을 기준으로 작성되었습니다.