오류의 종류

  • 프로그램 실행 전에 발생하는 오류 : 문법 오류
  • 프로그램 실행 중에 발생하는 오류 : 런타임 오류(예외)

예외 처리는 런타임 오류를 최대한 줄이는 것이다.

 

try-except

try-except의 기본 형태

try:
    #예외가 일어날 것 같은 코드 입력
except:
    #예외가 일어나면 할 작업 입력
  • try블록에는 예외가 일어날 것 같은 코드를 입력한다.
  • try블록에서 오류가 일어난다면 except블록에 입력된 명령이 실행된다.
  • try블록에서 오류가 일어나지 않는다면 except블록의 명령이 실행되지 않는다.
intnum = input("정수를 입력하세요 : ")
try:
    print(f"당신이 입력한 값은 {int(intnum)}입니다")
except:
    print("잘못된 값을 입력했습니다.")

위의 예제에서 사용자로부터 입력을 받고 그 값이 정수면 프로그래머가 의도한 대로 흐름이 이어지는 것이고, 실수나, 문자열 등을 입력하면 의도한 대로 흐름이 이어지는 것이 아니다. 그래서 except문으로 의도한 대로 가게끔 하면 된다.

 

try-except-else

try:
    #오류가 일어날수도 있는 작업 입력
except:
    #오류가 일어났을 때의 작업 입력
else:
    #오류가 일어나지 않았을 때 작업 입력

try-except-else구문은 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고 나머지를 모두 else구문으로 빼는 경우가 많다.

intnum = input("정수를 입력하세요 : ")
try:
    intnum = int(intnum)
except:
    print("잘못된 값을 입력했습니다.")
else:
    print(f"당신이 입력한 값은 {int(intnum)}입니다")

 

finally문

  • finally 구문은 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문이다.
  • 예외가 발생하든 안 하든 무조건 실행된다.
  • 함수 내부에서 try-finally문을 사용하고 있다면 return을 만나도 finally문은 실행된다.

 

intnum = input("정수를 입력하세요 : ")
try:
    intnum = int(intnum)
    print(f"당신이 입력한 값은 {int(intnum)}입니다")
except:
    print("잘못된 값을 입력했습니다.")
finally:
    print("finally 구문 실행")

위의 예제에서 사용자로부터 정수를 받아도 finally구문은 실행되고, 정수 이외의 값을 받아도 finally 구문은 실행된다.

 

def func(intnum):
    try:
        intnum = int(intnum)
        print(f"당신이 입력한 값은 {int(intnum)}입니다")
        return
    except:
        print("잘못된 값을 입력했습니다.")
        return
    finally:
        print("finally 구문 실행")
intnum = input("정수를 입력하세요 : ")
func(intnum)

위의 예제에서 함수 매개변수로 정수를 넘기든, 정수 외에 다른 값을 넘기든 finally문은 무조건 실행된다.

(return을 만나도 finally문은 실행됨)

 

예외 처리 조합

  • try-except
  • try-except-else
  • try-except-finally
  • try-except-else-finally
  • try-finally

이 외의 조합은 실행했을 때 문법 오류가 발생한다.

 

예외 구분하기

except 뒤에 예외의 종류를 입력해서 예외를 구분할 수 있음

try:
    #예외가 발생할 가능성이 있는 구문
except:예외의 종류A
    #예외 A가 발생했을 떄 실행할 구문
except:예외의 종류B
    #예외 B가 발생했을 떄 실행할 구문
except:예외의 종류C
    #예외 C가 발생했을 떄 실행할 구문

예를 들면

list_number = [52, 273, 32, 72, 100]
try:
    number_input = int(input("정수 입력> "))
    print(f"{number_input}번째 요소: {list_number[number_input]}")
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력하세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("리스트의 인덱스를 벗어났음")

이렇게 예외의 종류에 따라 다르게 대응할 수 있다.

 

예외 구분이 안될 때

위에서 예외를 구분했는데, 예외의 구분은 예외의 종류에 따라 다르게 대응하기 위함이다

하지만 예외의 종류를 알 수 없다면 어떻게 해야할까?

최대한 예외를 구분해서 사용자에게 알렸지만, 예외를 구분할 수 없다면 사용자에게 무슨 예외가 일어났는지 알려달라고 요청하는 방법밖에 없다.

우리가 어떤 프로그램을 쓰다가 오류가 나면 오류 내용을 서술해서 전송해달라고 요청하는 프로그램을 봤을 것이다.

이럴 때 사용하는 것이 모든 예외의 어머니인 Exception을 사용하는 것이다.

list_number = [52, 273, 32, 72, 100]
try:
    number_input = int(input("정수 입력> "))
    print(f"{number_input}번째 요소: {list_number[number_input]}")
    ㅇㅇ.ㅁㄴㅇㅁㄴㅇ()#일부러 예외를 발생시킴
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력하세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("리스트의 인덱스를 벗어났음")
except Exception:
    print("알수없는 오류가 일어났습니다. 오류 내용을 저희에게 알려주세요.")

이렇게 예외 처리를 하면 사용자에게 피드백을 받을 수 있다.

'Python Category > Python' 카테고리의 다른 글

[Python] 파이썬 기본적인 용어  (0) 2023.08.23
[Python] 내장 함수  (0) 2022.12.09
[Python] 파일 입출력  (1) 2022.12.08
[Python] 모듈  (0) 2022.12.08
[Python] 문자열  (1) 2022.12.08