본문 바로가기
Base/Python

21. 구문 오류와 예외 / 기본적인 예외처리 방법 / 예외처리 구문

by 귀멸 2023. 3. 24.

혼공파 72 ~ 74강

 

1. 구문 오류와 예외

예외로 부터 프로그램을 지켜내는 개발자가 되어야 한다.

기본적인 예외 패턴들이 있지만, 생각도 못한 곳에서 뒷통수를 많이 맞아봐야 실력이 키워짐.

# 예외(Exception)
# 오류(Error)의 일종
# - Syntax Error(= Compiler Error) : 프로그램 실행 전에 발생하는 오류
# - Runtime Error(= Exception) : 프로그램 실행 중에 발생하는 오류

# 구문오류 (Syntax Error)
print("# 프로그램이 시작되었습니다!")
print("# 구문 오류를 강제로 발생시킵니다!"

# Syntax Error가 발생하면 코드가 한줄도 실행되지 않는다.

# 예외(Exception)
print("# 프로그램이 시작되었습니다!")
리스트[1]
# NameError: name '리스트' is not defined

print(int(input("숫자를 입력해주세요>")))
ValueError: invalid literal for int() with base 10: '10.1'

# 사용자에 의한 예상치 못한 경우가 발생할 때도 예외 처리가 되어 있어야 함
# 예외가 구문오류보다 어려운 이유

2. 기본적인 예외처리 방법

기존에는 예외처리를 아래와 같이 조건문으로 만들어 줬지만,

현대의 프로그래밍은 예외를 처리할 수 있는 구문을 따로 제공한다.

입력 = int(input("정수 입력>"))

print(f"원의 반지름: {입력}")
print(f"원의 둘레: {2 * 3.14 * 입력}")
print(f"원의 넓이: {3.14 * 입력 * 입력}")

# 위의 코드의 경우 사용자 입력에서 정수가 아닌 부동소수를 입력하거나 7cm등의 문자가 입력되면 ValueError가 된다.
# 이런 예외를 처리할 수 있도록 코드를 다시 짜보면 아래와 같다.

입력 = input("정수 입력>")

if 입력.isdigit():
    숫자입력 = int(입력)
    
    print(f"원의 반지름: {입력}")
    print(f"원의 둘레: {2 * 3.14 * 입력}")
    print(f"원의 넓이: {3.14 * 입력 * 입력}")

else:
    print("정수를 입력하지 않았습니다.")

3. 예외처리 구문 try except

위의 기본적인 예외처리 방법에서 처럼 간단한 int 함수는 나올 수 있는 예외를 예측하기 쉬우나,

예외를 예측하기 힘든 경우가 더 많다.

try except 구문을 사용하여 위의 코드를 바꿔주면 아래와 같다.

예외가 나오는지 조건을 확인하는 코드를 구현할 필요가 없다.

입력 = input("정수 입력>")

try:
    숫자입력 = int(입력)
    print(f"원의 반지름: {입력}")
    print(f"원의 둘레: {2 * 3.14 * 입력}")
    print(f"원의 넓이: {3.14 * 입력 * 입력}")

except:
    print("정수를 입력하지 않았습니다.")

try except 구문 + pass 키워드 조합하기

try:
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생할 경우 실행할 코드
    여기에 실행 시키고 싶은 코드가 없으면 pass 키워드를 사용할 수 있음
    

# 아래 입력리스트를 숫자로 변환 가능한 것만 출력리스트에 담아서 출력하려고 할 때
입력리스트 = ["52", "273", "32.1", "103", "숫자로 변환 할 수 없는 문자열"]
출력리스트 = []

for 요소 in 입력리스트:
    if 요소가 숫자로 변환할 수 있다면?:
        출력리스트.append(float(요소))

print(출력리스트) # [52, 273, 32.1, 103]

# 이를 try except 구문을 이용해 쉽게 구현 가능
입력리스트 = ["52", "273", "32.1", "103", "숫자로 변환 할 수 없는 문자열"]
출력리스트 = []

for 요소 in 입력리스트:
    try:
        출력리스트.append(float(요소))
    except:
    	pass 
print(출력리스트) # [52, 273, 32.1, 103]


# 함수로 구현해서 사용해 보면

def isfloat(입력):
    try:
    	float(입력)
        return True
    except:
    	return False

for 요소 in 입력리스트:
   if isfloat(요소):
   		출력리스트.append(float(요소))
print(출력리스트) # [52, 273, 32.1, 103]

 

댓글