다양한 이유에서 프로그램이 실행을 멈춘 적이 있다. 그 이유가 오류 때문인지 '예외' 때문인지 알기 위해 이번 절에서는 '오류'와 '예외'를 구분하려고 한다.
오류의 종류
프로그램에서 오류(error)는 크게 두 가지 종류가 있다.
- 프로그램 실행 전에 발생하는 오류 - 구문 오류(syntax error)
- 프로그램 실행 중에 발생하는 오류 - 런타임 오류(runtime error) 또는 예외(exception)
오류를 나누는 기준에 따라서 로직 에러(logic error)도 있다.
구문 오류(syntax error)
구문 오류는 괄호의 열고 닫음이 맞지 않거나, 들여쓰기를 바르게 못했거나 등의 문제로 프로그램이 실행되기 전에 발생하는 오류이다.
print('여기에는 어떤 오류가 있다는 건가?)
File "<ipython-input-1-720befda79cc>", line 1 print('여기에는 어떤 오류가 있다는 건가?) ^ SyntaxError: unterminated string literal (detected at line 1)
위 코드 셀에 있는 print('여기에는 어떤 오류가 있다는 건가?) 문장은 실행시키기도 전에 (구글 코랩에서는) 빨간 줄이 그어진다. 문자열을 표현에서 닫는 따옴표가 누락됐다.
예외
예외 또는 런타임 오류는 실행 중에 발생하는 오류를 의미한다.
print("프로그램이 시작되었습니다.")
lst[0]
프로그램이 시작되었습니다.
NameError Traceback (most recent call last) <ipython-input-1-515d6de1f6d7> in <cell line: 2>() 1 print("프로그램이 시작되었습니다.") ----> 2 lst[0]
NameError: name 'lst' is not defined
이런 오류가 발생하면 어떻게 할까? 코드를 다시 짠다? 처음 코드를 짤 때 이런 드문 경우에 대비하도록 코드를 작성해야할 것이다. 예외 상황에 적절히 대처할 수 있도록 코드를 작성해야할 것이다.
기본 예외 처리
- 조건문을 사용하는 방법
- try 구문을 사용하는 방법
먼저 조건문을 사용해서 예외를 처리를 하는 방법부터 살펴보겠다. 이와 같은 예외 처리 방법을 기본 예외 처리라고 부른다.
- 예외를 해결하는 하기 위해 어떤 작업을 하는 것을 예외 처리(exception handling)라고 한다. 예외를 처리 하는 방법은 다음 두 가지로 나뉜다.
number = int(input("정수 입력: "))
print('원의 반지름 :',number )
print('원의 둘레 :', 2*3.14*number )
print('원의 면적 :', 3.14* number* number)
정수 입력: 7센치
ValueError Traceback (most recent call last) <ipython-input-3-1e7b50a37570> in <cell line: 1>() ----> 1 number = int(input("정수 입력: ")) 2 3 print('원의 반지름 :',number ) 4 print('원의 둘레 :', 23.14number ) 5 print('원의 면적 :', 3.14* number* number)
ValueError: invalid literal for int() with base 10: '7센치’
조건문으로 예외 처리하기
user_input = input('양의 정수 입력: ')
if user_input.isdigit():
number = int(user_input)
print(number)
print('원의 반지름 :',number )
print('원의 둘레 :', 2*3.14*number )
print('원의 면적 :', 3.14* number* number)
else:
print('양의 정수를 입력해 주세요.')
양의 정수 입력: 7센
양의 정수를 입력해 주세요.
위 코드 셀에서 문자열.isdigit()함수는 문자열이 숫자로만 구성되었다면 True를 그렇다 않다면 False를 반환한다. 여기서 핵심 사항은 예외가 발생할 수 있는 상황을 고려해서 상황별로 대처할 수 있도록 사전에 코딩 되었다는 것이다. 그래서 프로그램이 예외 발생으로 인해 중간에 종료되는 것을 막았다. 그리고 원활하게 동작을 하게 만들 것이다.
try except 구문
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외가 발생했을 때 실행할 코드
try:
number = int(input("정수 입력: "))
print('원의 반지름 :',number )
print('원의 둘레 :', 2*3.14*number )
print('원의 면적 :', 3.14* number* number)
except:
print('위 과정에서 예외가 발생했습니다.')
정수 입력: 7센찌
위 과정에서 예외가 발생했습니다.
위 코드는 try에 해당하는 코드들에서 예외가 발생하면 except에 해당하는 코드를 실행하라는 뜻이다. try에 해당하는 코드들에서 예외가 발생하지 않으면 excption에 해당하는 코드는 실행되지 않는다.
- try except 구문과 pass 키워드 조합하기
try:
#예외가 발생할 가능성이 있는 코드
except:
pass
"try 부분에서 예외가 발생했을 때 프로그램이 종료, 죽는다고 하자, 죽지 말고 except 부분의 코드를 실행해라. 그런데 excpt 부분이 패스네~ 그럼 아무 것도 하지 않고 패스~"
- try except else 구문
try except 구문 뒤에 esle 구문을 붙이면 '예외가 발생하지 않았을 때 실행할 코드' 를 지정할 수 있다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외가 발생했을 때 실행할 코드
else:
# 예외가 발생하지 않았을 때 실행할 코드
try except else 구문을 사용할 대는 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고 나머지는 모두 else 구문으로 빼는 경우가 많다.
positive_int = int( input('양의 정수를 입력 하세요 : ') )
try:
d = 10 // positive_int
s = 10 % positive_int
except:
print('예외 발생!')
else:
print(f'입력하신 수, {positive_int}로 10을 나누었을 때 몫은 {d}이고 나머지는 {s}입니다.')
양의 정수를 입력 하세요 : 1
입력하신 수, 1로 10을 나누었을 때 몫은 10이고 나머지는 0입니다.
- finally 구문
예외가 발생하든 하지 않든 무조건 실행해야 할 코드를 finally 부분에 위치 시킨다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외가 발생했을 때 실행되어야 하는 코드
else:
# 예외가 발생하지 않았을 때 실행되어야 하는 코드
finally:
# 예외 발생 여부와 관계 없이 무조건 실행되어하는 코드
try, except, finally 구문의 조합
예외 처리 구문은 다음과 같은 규칙을 지켜야 한다.
- try 구문은 단독으로 사용할 수 없으며 반드시 except 구문 또는 finally 구문과 함께 사용해야 한다.
- else 구문은 반듯이 except 구문 뒤에 사용해야 한다.
이를 조합해 보면
- try + except
- try + except + else
- try + except + finally
- try + excpet + else + finally
- try + finally
'빅데이터 분석가 양성과정 > Python' 카테고리의 다른 글
Ch07-1 모듈 / 표준 모듈 (0) | 2024.07.05 |
---|---|
Ch06-2 예외 처리 / 예외 고급 (1) | 2024.07.05 |
Ch05-2 함수 / 함수의 활용 (0) | 2024.07.05 |
Ch05-1 함수 / 함수 만들기 (0) | 2024.07.05 |
Ch04-4 반복문 / 문자열, 리스트, 딕셔너리 (3) | 2024.07.05 |