자기계발/Python

[Python] 기본15. 구문 오류와 예외

호등 2022. 3. 10. 12:18
반응형

오류의 종류

1) 프로그램 실행 전에 발생하는 오류 → 구문 오류(syntax error)
문자열 따옴표를 제대로 닫지 않아 프로그램 시작이 아예 안되는 오류
2) 프로그램 실행 중에 발생하는 오류 → 예외(exception) 또는 런타임 오류(runtime error)
프로그램이 일단 실행된 다음 실행 중 발생하는 오류

기본 예외 처리

예외를 처리하는 방법에는 두 가지 방법이 있다.
* 조건문을 사용하는 방법 → 기본 예외 처리라고 부름
* try 구문을 사용하는 방법

기본 예외 처리(조건문 사용)

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

#원 둘레, 넓이 구하기
print("원의 반지름:", number_input_a)
print("원의 둘레:", number_input_a * 2 * 3.14)
print("원의 넓이:", number_input_a * number_input_a * 3.14)

위 코드를 실행하면 언뜻봐서는 별 문제가 없어 보인다.
하지만 값을 입력받는 곳에는 정수가 입력되지 않았을때 문제가 발생한다.

#숫자를 입력받는다.
user_input_a = input("정수 입력> ")

#사용자 입력이 숫자로만 구성되었을때
if user_input_a.isdigit():
	#숫자 변환
    number_input_a = int(user_input_a)
    
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", number_input_a * 2 * 3.14)
    print("원의 넓이:", number_input_a * number_input_a * 3.14)
else :
    print("정수를 입력해야합니다.")

위 코드를 isdigit()함수를 사용하여 숫자로만 구성된 글자인지 확인한다면,
int()함수에 문자가 들어갔을때 생기는 예외를 피할 수 있다.

try except 구문

예외가 발생할 상황을 모두 예측하기 힘들기 때문에 생긴 예외 처리 구문이다.

try:
□□□□ 예외가 발생할 가능성이 있는 코드
except:
□□□□ 예외가 발생했을 때 실행할 코드
# try except 구문으로 예외 처리
try :
	#숫자로 변환
    number_input_a = int(input("정수 입력> "))
	
    #출력
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", number_input_a * 2 * 3.14)
    print("원의 넓이:", number_input_a * number_input_a * 3.14)
    
except :
    print("오류가 발생했습니다.")

try 구문엔 예외가 발생할 수 있는 코드를 전부 넣어주고,
except 구문엔 예외가 발생했을 때 실행할 코드를 넣어주면 된다.
try, except 구문은 if 구문(조건문)을 활용하는 코드에 비해 속도가 좀 더 느리다.

try except 구문과 pass 키워드 조합

예외가 발생했을 때 해당 코드가 딱히 중요한 부분이 아니라면 프로그램을 강제 종료 되는 것을 막기 위해 except 부분에 pass 키워드를 넣어준다. (물론 예외를 해결하는게 중요하지만..!)

list_input_a = ["1", "2", "3", "사과", "5"]

list_number = []
for item in list_input_a :
	#숫자로 변환하여 리스트에 추가
    try :
        float(item)
        list_number.append(item)
    except :
        pass
    
print("결과는 {}입니다.".format(list_number))
#출력결과 : 결과는 ['1', '2', '3', '5']입니다.

try except구문과 pass 키워드를 조합한 코드이다.
"사과" 요소를 float로 변환할 수 없어서 예외가 발생할 상황이지만 그냥 넘어간 뒤에 다시 try에 있는 코드를 실행한다.

추가로 try except else 구문도 있다.

try :
□□□□ 예외가 발생할 가능성이 있는 코드
except :
□□□□ 예외가 발생했을 때 실행할 코드
else :
□□□□ 예외가 발생하지 않았을 때 실행할 코드

try에는 예외가 발생할 가능성이 있는 코드만 넣어주고,
except엔 예외가 발생했을 때 실행하는 코드,
나머지를 모두 else로 빼주면 된다.

C++,C#,Java,JavaScript, PHP, ObjectiveC, Swift, Kotlin 등의 프로그래밍 언어에는 예외 처리에 else 구문이 없고, 이게 있는 프로그래밍 언어는 파이썬과 루비 정도라고 한다. try except 구문으로도 충분히 작성할 수 있기 때문에 굳이 쓸 필요는 없으며, 썼을때의 장점은 가독성이 좋아진다 정도라고 함

finally 구문

try :
□□□□ 예외가 발생할 가능성이 있는 코드
except :
□□□□ 예외가 발생했을 때 실행할 코드
else :
□□□□ 예외가 발생하지 않았을 때 실행할 코드
finally :
□□□□ 무조건 실행할 코드

finally 구문은 예외 처리 구문에서 가장 마지막에 사용하는 구문이며 예외가 발생하든 않든 무조건 실행한다.
try 구문 중간에 return으로 빠져나가거나, while과 같은 반복문에서 break로 빠져나갈때도 무조건 실행하기 때문에 주로 함수 내부에서 파일 처리 코드를 깔끔하게 만들고 싶을 때 finally 구문을 활용한다.

try, except, finally 구문을 조합할 때 다음 사항은 반드시 지켜야한다.
try 구문은 단독으로 사용 불가능하며 except나 finally와 함께 사용한다.

반응형