프로그래밍 언어의 오류에는 2가지 종류가 있습니다.

구문오류 - 프로그램 실행 전에 발생하는 오류

예외, 런타임오류 - 프로그램 실행 중에 발생하는 오류

구문오류(Syntax error)

괄호의 갯수, 들여쓰기 문제 등으로 발생하는 오류입니다.

구문 오류는 해결하지 않으면 프로그램 자체가 실행되지 않습니다.

 

예외(exception), 런타임오류(runtime error)

실행중에 발생하는 오류입니다.

 

기본 예외 처리(exception handling

예외를 해결하는 과정의 모든 것을 예외 처리라고 부릅니다.

조건문을 사용하는 방법

try 구문을 사용하는 방법

 

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

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

이렇게 코드를 만들고 숫자를 입력하면 결과 값이 나옵니다.

정수 입력> 15
원의 반지름: 15
원의 둘레: 94.2
원의 넓이: 706.5

그런데 입력할 때 숫자와 함께 문자를 넣으면 에러가 발생하는데요.

정수 입력> 15cm   
Traceback (most recent call last):
  File "h06.py", line 1, in <module>
    number_input_a = int(input("정수 입력> "))
ValueError: invalid literal for int() with base 10: '15cm'

 

이런 문제를 해결하기 위해 조건문으로 예외처리해 보겠습니다.

 

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

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

숫자와 문자를 함께 넣어도 문제없이 프로그램이 작동되는 것을 확인할 수 있습니다.

그런데 조건문 만으로 예외처리 할 수 없기에 try except 구문을 사용하는 것이 편리합니다.

 

try:
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 실행할 코드

   

try:
    number_input_a = int(input("정수 입력> "))
    
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", 3.14 * number_input_a * number_input_a)

except:
    print("문제가 생겼습니다.")

 

try except 구문과 pass 키워드를 조합해서 예외가 발생하면 그냥 넘어가도록 할 수도 있습니다.

 

try excepr else 구문

try:
    # 예외가 발생할 가능성이 있는 코드
    number_input_a = int(input("정수 입력> "))
    
except:
    # 예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")

else:
    # 예외가 발생하지 않았을 때 실행할 코드
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", 3.14 * number_input_a * number_input_a)

 

finally 구문

try:
    # 예외가 발생할 가능성이 있는 코드
    number_input_a = int(input("정수 입력> "))
    
except:
    # 예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")

else:
    # 예외가 발생하지 않았을 때 실행할 코드
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", 3.14 * number_input_a * number_input_a)
    
finally:
    # 무조건 실행할 코드
    print("무조건 출력되는 문장이랍니다.")
"""
정수 입력> 15
원의 반지름: 15
원의 둘레: 94.2
원의 넓이: 706.5
무조건 출력되는 문장이랍니다.
"""

 

구문 오류와 예외의 차이는

구문 오류는 프로그램의 문법적인 오류로 실행조차 되지 않는 오류이고요.

예외는 프로그램 실행 중에 발생하는 오류입니다.

이런 오류를 방지하기 위해 try except 구문을 사용합니다.

 

 

예외 고급

try:
    # 예외가 발생할 가능성이 있는 코드
    number_input_a = int(input("정수 입력> "))
    
    print("원의 반지름:", number_input_a)
    print("원의 둘레:", 2 * 3.14 * number_input_a)
    print("원의 넓이:", 3.14 * number_input_a * number_input_a)
    
    
except Exception as exception:
    # 예외 객체를 출력해봅니다.
    print("type(exception): ", type(exception))
    print("exception: ", exception)
정수 입력> 8cm 
type(exception):  <class 'ValueError'>
exception:  invalid literal for int() with base 10: '8cm'

이 코드에서는 잘못된 값을 입력할 때 생기는 ValueError이 나오는데요.

값의 범위를 벗어나는 경우에는 IndexError이 발생됩니다.

 

list_number = [4, 2, 42, 53, 170]

try:
    number_input_a = int(input("정수 입력> "))
    
    print("{}번째 요소: {}".format(number_input_a, list_number[number_input_a]))
    
except Exception as exception:
    # 예외 객체를 출력해봅니다.
    print("type(exception): ", type(exception))
    print("exception: ", exception)

이렇게 코딩을 해서 

정수 입력> 2
2번째 요소: 42

이렇게 출력이 되는데요.

정수 입력> 10
type(exception):  <class 'IndexError'>
exception:  list index out of range

 

범위를 넘어서는 값을 입력하면 에러가 납니다.

이렇게 예외의 종류가 달라지는데요.

예외의 종류에 따라 구분하는 코드를 만들어 보겠습니다.

 

list_number = [4, 2, 42, 53, 170]

try:
    number_input_a = int(input("정수 입력> "))
    
    print("{}번째 요소: {}".format(number_input_a, list_number[number_input_a]))
    
except ValueError:
    print("정수를 입력해 주세요")
    
except IndexError:
    print("리스트의 범위를 벗어났습니다.")

이렇게 만들면 되고요.

이외에도 다양한 에러가 발생했을 때 실행할 예외구문을 넣어 주는 경우가 필요한데요.

이럴때는 가장 뒤에 

except Exception as exception:
    # 예외 객체를 출력해봅니다.
    print("미리 파악하지 못한 예외가 밠애했습니다.")
    print("exception: ", exception)

를 추가시켜 주면 됩니다.

 

raise 구문

아직 구현되지 않은 부분이므로 일부러 예외를 발생시켜 프로그램을 주겍 만들어 잊지않도록 하는 키워드입니다.

raise 예외 객체

 

 

'혼공파' 카테고리의 다른 글

07-2 외부 모듈  (0) 2024.02.11
혼공파 7장 모듈(1)  (0) 2024.02.04
혼공파 4주차 5장 함수  (2) 2024.01.28
혼공파 3주차 Ch04 반복문  (1) 2024.01.21
혼공파 ch3 조건문  (1) 2024.01.15

+ Recent posts