오류의 종류
- 프로그램 실행 전에 발생하는 오류 : 문법 오류
- 프로그램 실행 중에 발생하는 오류 : 런타임 오류(예외)
예외 처리는 런타임 오류를 최대한 줄이는 것이다.
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 |