자료실/파이썬(Python)

파이썬(Python) - 예외 처리(Exception)

자료수집중 2020. 7. 17.
반응형

앞에 글에서 가끔 예외가 발생한다는 말을 했었습니다.

보통 예외는 실행 도중에 발생합니다. 작성한 코드에는 문제가 없으나 실행 도중 타입 불일치, 인덱스 초과 등의 에러가 발생할 때 예외라고 합니다.

간단하게 예외를 발생시켜보겠습니다.

value = input("숫자 입력: ")
print(int(value));

만약 정수를 입력받는 코드에 문자를 입력하면 어떻게 될까요.

바로 예외가 발생합니다.

위의 에러 내역을 보면 ValueError라는 예외가 발생했습니다. 실행해야 할 데이터가 잘못되면 발생합니다.

이런식으로 어떤 예외가 발생했는지도 알 수 있습니다.

 

문제는 예외가 발생하게 되면 프로그램이 종료됩니다.

한 번의 입력 실수로 처음부터 다시 실행시켜야 하는 번거로움이 발생하게 됩니다.

그래서 이때 예외 처리를 합니다.

예외 처리는 말 그대로 예외가 발생했을 때 프로그램이 종료되는 게 아니라 예외를 처리 후 계속 진행되게 합니다.

 

 

예외 처리에는 try, except, else, finally를 사용합니다.

예외 처리의 형식은 다음과 같습니다.

try:
    실행할 코드
except:
    예외가 발생 했을 때 처리 코드
else: 
    예외가 발생하지 않을 때 처리 코드
finally:
    예외 발생 여부와 상관없이 실행되는 코드

finally else는 생략이 가능합니다.

 

 

except는 예외가 발생하면 모두 처리합니다. 

하지만 각각 예외가 발생하는 원인이 다르고 대처법도 다르기 때문에 좀 더 자세하게 예외를 처리할 필요가 있습니다.

그래서 예외를 직접 입력해서 처리합니다.

except: 예외 as 변수
    예외가 발생 했을 때 처리 코드
   

발생할 예외를 미리 입력해두면 해당 예외가 발생하면 except가 실행됩니다. 변수는 에러 메시지가 입력이 됩니다. as 변수는 생략이 가능합니다.

except는 여러 개 선언해서 각각의 예외에 다른 대응도 가능합니다.

try:
    실행할 코드
except: 예외 as 변수
    예외가 발생 했을 때 처리 코드
except: 예외 as 변수
    예외가 발생 했을 때 처리 코드
except: 예외 as 변수
    예외가 발생 했을 때 처리 코드
else: 
    예외가 발생하지 않을 때 처리 코드

except에서 여러 예외를 동시에도 처리가 가능합니다.

예외들을 ()로 묶어서 사용하면 됩니다.

try:
    실행할 코드
except (예외, 예외) as 변수:
    예외가 발생 했을 때 처리 코드
else: 
    예외가 발생하지 않을 때 처리 코드

as 변수는 생략이 가능합니다.

 

 

많이 발생하는 예외를 몇 가지 알아보겠습니다.

더 많은 예외를 보고 싶다면 다음 링크를 참조해 주세요

 

내장 예외 — Python 3.8.4 문서

내장 예외 파이썬에서, 모든 예외는 BaseException 에서 파생된 클래스의 인스턴스여야 합니다. 특정 클래스를 언급하는 except 절을 갖는 try 문에서, 그 절은 그 클래스에서 파생된 모든 예외 클래스�

docs.python.org

 

 

음식 메뉴를 받는 예제를 작성해보겠습니다.

메뉴는 인덱스에 사용하기 위해서 정수만을 받아야 합니다. 그리고 없는 메뉴를 골라도 안됩니다. 인덱스 범위에 벗어나기 때문입니다.

그러면 위의 주의사항을 잡아줄 예외 두 가지 ValueError와 IndexError를 예외 처리하겠습니다.

menu = ["냉면", "볶음밥", "피자", "짜장면"]
while 1:
    order = input("[메뉴를 선택해 주세요 (1.냉면, 2.볶음밥, 3.피자, 4.짜장면 (숫자로 입력해 주세요)] : ")
    try:
        print(menu[int(order) - 1] + "을 선택하셨습니다.")
    except ValueError:
        print("숫자만 입력하세요")
    except IndexError:
        print("없는 메뉴입니다.")
    else:
        break
    finally:
        print("--------------------------")

정수가 아닌 문자열을 입력하자 인덱스에 사용할 수 없는 값이 입력되고 ValueError예외가 발생합니다.

보통은 여기서 프로그램이 종료되지만 예외처리를 통해서 계속 진행되게 합니다.

메뉴에 없는 정수를 입력하자 인덱스 범위를 넘어가는 값이기 때문에 IndexError예외가 발생하게 됩니다. 

메뉴에 있는 정수를 입력하자 elsebreak가 실행되고 무한 루프를 탈출하게 됩니다.

finally를 이용해서 예외 발생 여부와 상관없이 오더들을 나눠주는 출력을 입력했습니다.

 

 

예외처리를 사용하면 사소한 에러를 스크립트가 중단하지 않고 처리해서 계속 실행할 수 있게 해 줍니다. 

 

댓글