오류의 종류(Error)
프로그래밍 언어의 오류에는 두가지 종류가 있다.
프로그램이 실행되기 전에 발생하는 오류를 구문 오류(Syntax Error),
프로그램 실행 중에 발생하는 오류를 예외(Exception) 또는 런타임 오류(Runtime Error)라고 구분한다.
구문 오류 (Syntax Error)
구문오류는 괄호의 개수, 들여쓰기 문제 등으로 프로그램이 실행되기 전에 발생하는 오류이다.
예를들어 print() 함수의 문자열을 닫지 않고 print("안녕!) 으로 작성하여 코드를 실행하면
"SyntaxError: EOL(End Of Line)" 오류가 발생된다.
즉 SyntaxError는 구문에 문제가 있어 프로그램이 실행되지 않는 오류이다.
예외(exception)
예외 또는 런타임 오류는 프로그램이 실행되는 중에 발생하는 오류를 의미한다.
예를 들어 list_a에 대하여 정의하지 않은 상태에서 list_a[1]을 읽어오도록 하면
코드가 실행되고 list_a[1]을 읽을 때 "NameError: name 'list_a' is not defined" 오류가 발생된다.
이처럼 프로그램이 일단 실행된 다음, 실행중에 발생된 오류를 예외 또는 런타임 오류라고 한다.
기본 예외처리
예외를 해결하는 방법을 예외 처리(Exception Handling)라고 부르며, 주로 조건문이나 try 구문을 사용해 예외처리를 한다.
* 구문오류는 프로그램 실행 자체가 되지않기 때문에 예외처리 방법으로 처리할 수 없으며, 문법문제가 발생한 코드를 수정해야한다.
number_input_a = int(input("정수입력 > "))
print("원의 반지름: ", number_input_a)
print("원의 둘레: ", 2 * 3.14 * number_input_a)
위와 같이 값을 입력받아 원의 반지름과 둘레를 계산하는 코드가 있다고 생각해보자.
만약 사용자가 입력할 때 정수가 아닌 형태(ex. 7cm)를 입력한다면, ValueError가 발생되게 될것이다.
조건문으로 예외처리하기
위의 예제에 대하여 '정수를 입력하지 않았을 때'를 조건문으로 작성해서 예외처리를 하도록 구현해보자.
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)
else :
print("정수를 입력해주세요.")
문자열 isdigit() 함수를 사용해 숫자로만 구성된 글자인지 확인하고,
숫자만 입력된 경우에 if문 코드를 실행하고, 그렇지 않으면 "정수를 입력해주세요"라는 문자열을 출력한다.
try except 구문
예외가 발생할 수 있는 상황을 모두 예측하고 조건문으로 처리하는 것은 매우 어려운 일이다.
그래서 프로그래밍언어는 예외를 처리할 수 있는 try except 구문을 제공한다.
try:
예외가 발생할 가능성이 있는 코드
except:
예외가 발생했을 때 실행할 코드
try except 구문을 이용하면 어떤 상황에 예외가 발생할지 완벽하게 이해하고 있지 않아도 프로그램이 강제로 죽어버리는 상황을 막을 수 있다.
위의 조건문으로 예외처리한 예제를 try except 구문으로 변경하면 아래와 같이 작성할 수 있다.
try:
number_input_a = input("정수 입력>")
print("원의 반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
except :
print("입력값을 확인해주세요.")
try except 구문과 pass 키워드 조합하기
프로그래밍을 하다보면 예외처리가 필수이지만, 해당 코드가 딱히 중요한 부분이 아니라면 일단 프로그램이 강제종료되는 것부터 막기 위한 목적으로 except 구문에 pass 키워드를 넣기도 합니다.
try:
예외가 발생할 가능성이 있는 코드
except:
pass
예제를 통해 살펴보자.
list_input_a = ["52","273","32","스파이","104"]
list_number = []
for item in list_input_a:
try :
float(item) # list_input_a의 요소를 float으로 전환
list_number.append(item) #예외가 발생하지 않으면 list_number에 추가.
except:
pass # float(item) 실행 시 예외가 발생하면 pass
print("list_input_a 내부에 있는 숫자 요소는")
print("{}입니다.".format(list_number))
숫자로 변환할 수 없는 문자열이라면 float(item) 실행 시 예외가 발생하는 점을 이용해 try except 구문을 작성하였다.
다만 try except 구문은 조건문을 활용하는 코드에 비해 느리다는 점에 유의하자.
try except else 구문
try except 구문 뒤에 else 구문을 붙여서 사용하면 '예외가 발생하지 않았을때 실행할 코드'를 지정할 수 있다.
try:
예외가 발생할 가능성이 있는 코드
except:
예외가 발생했을 때 실행할 코드
else:
예외가 발생하지 않았을 때 실행할 코드
try except else 구문을 사용할 때는 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고, 나머지를 모두 else 구문으로 작성한다.
위의 try except 구문 예시를 try except else 구문으로 수정하면 아래와 같다.
try:
number_input_a = input("정수 입력>")
except :
print("입력값을 확인해주세요.")
else:
print("원의 반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
finally 구문
finally 구문은 예외가 발생하든 발생하지 않든 무조건 실행할 수 있는 코드로, 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문이다.
try:
예외가 발생할 가능성이 있는 코드
except:
예외가 발생했을 때 실행할 코드
else:
예외가 발생하지 않았을 때 실행할 코드
finally:
무조건 실행할 코드
예제를 통해 살펴보자.
try:
number_input_a = input("정수 입력>")
print("원의 반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
except :
print("입력값을 확인해주세요.")
else:
print("예외가 발생하지 않았습니다.")
finally:
print("프로그램이 종료됩니다.")
try, except, finally 구문의 조합
- try 구문은 단독으로 사용할 수 없으며, 반드시 except 구문 또는 finally 구문과 함께 사용해야한다.
- else 구문은 반드시 except 구문 뒤에 사용해야한다.
- try, except, else, finally 구문의 조합 유형( 이 외의 조합은 실행했을 때 구문오류가 발생된다. )
- try + except
- try + except + else
- try + except + finally
- try + except + else + finally
- try + finally
'Spec UP - Backend > 혼자 공부하는 파이썬' 카테고리의 다른 글
chap_08. 클래스 (1) | 2024.01.09 |
---|---|
chap_07. 모듈 (0) | 2023.12.19 |
chap_05-3. 함수 고급 (0) | 2023.11.13 |
chap_05-2. 함수의 활용 (0) | 2023.11.13 |
chapter_05-1. 함수 만들기 (0) | 2023.10.27 |
댓글