본문 바로가기
[개발자 로드맵]/파이썬

[혼자 공부하는 파이썬] 구문 오류와 예외

by Ramrider 2023. 9. 25.
728x90
반응형

오류의 종류

# 오류(Error)
# 1. Syntax Error, Compiler error : 프로그램 실행 전에 발생하는 오류
# 2. Runtime Error, Exception : 프로그램 실행 중에 발생하는 오류

# Syntax Erorr = 구문 오류 의 예제

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

 

# 예외(Exception) 예제1

print("# 프로그램이 시작되었습니다!")
리스트[1]

 

# 예외(Exception) 예제2

print("# 프로그램이 시작되었습니다!")
print(int(input("숫자를 입력해주세요> ")))

#만약 input에 문자열을 넣는다면? error가 발생될 것이다
#사용자는 개발자가 예상한대로 사용하지 않는다.
#예외가 너무 다양하기때문에 Syntax error보다 훨씬 까다롭다

 

기본적인 예외처리 방법

예외가 발생할 수 있는 코드 작성하기

1) 조건문으로 예외 발생막기

# 실수를 넣는다던가, 문자열을 넣으면 에러가 발생한다
# 어떤 예외가 간단하게 떠올릴 수 있다면 if문으로 간단하게 처리를 할 수 있다.
# 가장 기본

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

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

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

 

2) 예외처리의 try except 구문

# 세상의 예외는 예측하기가 실제로 너무 힘들다
# 그래서 try except를 활용한다.

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

try :
    #예외가 발생할 수 있는 코드
    숫자입력 = int(입력)
    print(f"원의 반지름: {숫자입력}")
    print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
    print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")

except:
    #예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")

 

# 예를들어 입력이 부동소수점인지 확인하는 코드를 if문으로 작성하게된다면
# 생각보다 많은 시간이 소요되고 어려울 수 있으나
# try-except를 활용하면 간단하게 처리가 가능하다
# 단, 예외를 구분하는 로직을 떠올릴 필요가 없는것이지
# 대충 어떤 예외가 발생할지를 떠올릴 필요가 없어지는 것은 아니므로
# 대충 여기서 무슨 예외가 뜨겠구나는 떠올려야
# try- except로 감쌀 수 있다

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

try :
    #예외가 발생할 수 있는 코드
    숫자입력 = float(입력)
    print(f"원의 반지름: {숫자입력}")
    print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
    print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")

except:
    #예외가 발생했을 때 실행할 코드
    print("숫자를 입력하지 않았습니다.")

 

3) try except 구문 + pass키워드

try :

except :
    #이쪽을 비우게 되는 경우가 있을 수도 있는데
    #이때 비워버리면 구문 오류가 발생할 수 있어서
    #pass를 넣어서 활용하기도한다
    pass

 

#출력으로 [52, 273, 32.1, 103]이 나오도록 하여라

입력리스트 = ["52", "273", "32.1", "103", "숫자로변환"]
출력리스트 = []

for index in 입력리스트:
    try:
        출력리스트.append(float(index))
    except:
        pass

print(출력리스트)

# for 내부에 try에 원래는 if문을 작성해서
# index가 숫자라면 이 작성되어야하는데,
# 정수와 실수가 함께 있어서 생각보다 로직을 떠올리기가 까다롭다.
# 그런데 이렇게 작성하게되었을 경우,
# 협업자나 제 3자가 봤을 때 단번에 이해하기는 어려움이 있다

 

# 그래서 아래와 같이 함수를 작성한다면
# is float이라는 이름만 보면
# 대충 float인지 확인하는 코드인지 알 수 있다

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

입력리스트 = ["52", "273", "32.1", "103", "숫자로변환"]
출력리스트 = []

for index in 입력리스트:
    if isfloat(index):
        출력리스트.append(float(index))

print(출력리스트)

 

예외처리의 else finally 구문

try :
    pass
except:
    pass
else:
    pass
finally:
    pass

#순서를 지켜줘야한다.
#일반적으로 try-except와 try-except-finally를 많이 활용한다
#else는 사용되지 않는다.

 

finally 구문

try :
    #예외가 발생할 가능성이 있는 코드
    숫자입력 = int(input("정수입력> "))
    #예외가 발생하지 않았을 때 실행할 코드
    print(f"원의 반지름: {숫자입력}")
    print(f"원의 둘레: {2 * 3.14 * 숫자입력}")
    print(f"원의 넓이: {3.14 * 숫자입력 * 숫자입력}")

except:
    #예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")

finally:
    #무조건적으로 실행하는 코드
    print("무조건 실행되는 코드입니다.")

 

# 이런식으로 finally는 함수에 들어갔을 때
# return과 관계없이 무조건 실행된다

def 함수():
    print("함수()에 진입했습니다.")
    try :
        print("try 구문에 진입했습니다.")
        return
        print("try 구문이 끝났습니다.")
    except:
        print("except 구문에 진입했습니다.")
    finally:
        print("finally 구문에 진입했습니다")

    print("함수()가 끝났습니다")
함수()

 

# 사용자로부터 파일 이름을 입력 받고
# 그 파일의 내용을 int() 함수로 정수로 변환한 뒤 출력하는 프로그램

def 함수(파일이름):
    try:
        파일 = open(파일이름, "r")
        내용 = 파일.read()
        try:
            숫자 = int(내용)
            return 내용
        except:
            print("숫자로 변환할 수 없는 파일입니다.")
        finally:
            파일.close()
    except:
        print("존재하지 않는 파일입니다.")

파일이름 = input("파일 이름> ")
print(함수(파일이름))

#finally구문은 함수 내부에 사용했을 때 의미를 발휘한다.
#excpet, finally 구문이 예외를 막는 코드는 아니다.
#따라서 except, finally 구문 내부에서 예외가 발생하면 프로그램이 죽는다

 

# 최종적으로 깔끔하게 정리한다면 이렇게 할 수 있다

def 함수(파일이름):
    파일 = None
    try:
        파일 = open(파일이름, "r")
        내용 = 파일.read()
        숫자 = int(내용)
        return 내용
    except ValueError:
        print("숫자로 변환할 수 없는 파일입니다.")
    except FileNotFoundError:
        print("존재하지 않는 파일입니다.")
    finally:
        if 파일 != None:
            파일.close()

파일이름 = input("파일 이름> ")
print(함수(파일이름))
728x90
반응형

댓글