055 예외처리 이해하기 ① (try~except)
프로그램을 작성하다 보면 뜻하지 않은 오류가 발생하는 코드가 있을 수 있음.
프로그램이 실행되는 동안 오류가 발생하면 프로그램이 더 이상 진행될 수 없는 상태가 되는데 이를 예외사항이라고 함.
프로그램 예외가 발생하더라도 프로그램을 중단시키지 않고 예외에 대한 적절한 처리를 하여 프로그램을 계속 진행 시킬 수 있도록 하는 구문이 try ~ except.
# 문법
# try:
# 문제가 없을 경우 실행할 코드
# except:
# 문제가 생겼을때 실행할 코드
예제1. try~except를 사용해서 예외처리를 하지 않았을 때의 코드
def my_devide():
x = input('분자의 숫자를 입력하세요')
y = input('분모의 숫자를 입력하세요')
return int(x)/int(y)
print(my_devide())
#분자의 숫자를 입력하세요 10
#분모의 숫자를 입력하세요 0
#ZeroDivisionError: division by zero => 에러가 나면서 프로그램 종료
예제2. try~except절을 사용했을 때의 코드
def my_devide():
try:
x = input('분자의 숫자를 입력하세요')
y = input('분모의 숫자를 입력하세요')
return int(x)/int(y)
except:
return '잘못된 값을 입력했습니다. 나누기를 할 수 없습니다.'
print(my_devide())
#분자의 숫자를 입력하세요 10
#분모의 숫자를 입력하세요 0
#잘못된 값을 입력했습니다. 나누기를 할 수 없습니다. <= 에러 x, excepet가 실행됨
문제204. 아래와 같이 숫자를 물어보게하고 숫자를 입력하면 해당 숫자의 제곱값이 출력되게 하는 함수를 생성하세요.
문제205. 위의 gegop()함수를 수행할 때 다음과 같이 숫자가 아닌 다른 문자를 입력하면 에러가 나면서 끝나버림. gegop()함수에 예외처리를 해서 메시지를 출력되게 하시오.("잘못된 값을 입력했습니다. 숫자를 입력하세요.")
def gegop():
try:
x = int(input('숫자를 입력하세요 '))
return x**2
except:
print('잘못된 값을 입력했습니다.숫자를 입력하세요')
print(gegop())
#숫자를 입력하세요 2
#4
#숫자를 입력하세요 a
#잘못된 값을 입력했습니다. 숫자를 입력하세요.
문제206. (점심시간 문제) 커피 키오스크를 실행해서 주문할 때 다음과 같이 알파벳을 넣으면 에러가 나면서 키오스크 시스템이 종료되는데 에러가 나지 않고 잘못된 값을 입력했다는 메세지가 출력되게하시오 (예외처리로 하세요 )
while True:
# 전체 품절
if c_stock[0] == 0 and c_stock[1] == 0 and c_stock[2] == 0 and c_stock[3] == 0:
print('\n\n\n모든 커피가 품절입니다.')
print('='*40,'\n')
break
try:
num = int(input('\n%d번손님,주문하시겠습니까? \n메뉴를 골라주세요. 번호를 눌러주세요.'%order_no))
except:
print('\n잘못된 값을 입력했습니다. 숫자를 입력하세요.\n처음 화면으로 돌아갑니다.')
continue
056 예외처리 이해하기 ② (try~except~else)
어떤 로직을 수행할 때 오류 상황이 아닐 경우에만 어떤 작업을 수행하는 코드를 작성해야할 때가 있음.
이 경우 try ~ except~else 구문을 활용
# 문법
# try:
# 실행할 코드 블럭
# except:
# 예외처리할 코드 블럭
# else:
# except절을 만나지 않았을 경우 실행하는 코드 블럭
try:
num = int(input('숫자를 입력하세요~ '))
print( num **2 )
except:
print('잘못된 값을 입력하셨습니다.')
else:
print('결과 출력에 성공했습니다.')
문제207. 아까 했던 나누기 프로그램을 수정해서 나누기를 성공하면 "성공적으로 나누기를 하였습니다."라는 메시지가 출력되게 하시오
def my_devide():
try:
x = input('분자의 숫자를 입력하세요 ')
y = input('분모의 숫자를 입력하세요 ')
print(int(x)/int(y))
except:
return '잘못된 값을 입력했습니다. 나누기를 할 수 없습니다.'
else:
print('성공적으로 나누기를 하였습니다.')
057 예외처리 이해하기 ③ (try~except~finally)
오류 발생 유무와 상관없이 어떤 코드를 무조건 실행 시키려면 try~except~finally 구문을 활용함.
무조건 실행시키는 코드는 finally에 작성하면 됨.
try:
print('안녕하세요~')
except:
print('예외가 발생했습니다.')
finally:
print('저는 무조건 실행됩니다.')
문제208. 나누기를 하는 프로그램을 실행할때 오류가 나던 오류가 나지 않던 무조건 아래 메시지가 출력되게 하시오.
분자를 입력하세요 ~ 10
분모를 입력하세요 ~ 2
5
이 프로그램의 사용기간은 30일 남았습니다. <- 오늘 실행하는 경우
이 프로그램의 사용기간은 29일 남았습니다. <- 내일 실행할 경우
1. 오늘 날짜 확인하기
import datetime
now = datetime.datetime.now()
print(now)
2. 오늘날짜에서 30일 더한 후 날짜 출력하기
import datetime
now = datetime.datetime.now()
print(now + datetime.timedelta(days=30))
# 날짜 더하는 함수만 참고할 것
3. 남은 기간 구하기
import datetime
now = datetime.datetime.now()
after2 = '2022-01-20'
lasttime = datetime.datetime.strptime(after2, '%Y-%m-%d') # 문자를 날짜로 변경
print((lasttime-now).days)
4. 위의 코드를 나누기 프로그램 finally에 추가하기
def my_devide():
try:
x = input('분자의 숫자를 입력하세요 ')
y = input('분모의 숫자를 입력하세요 ')
print( int(x)/int(y) )
except:
print('잘못된 값을 입력했습니다. 나누기를 할 수 없습니다.')
finally:
import datetime
now = datetime.datetime.now()
after2 = '2022-01-20'
lasttime = datetime.datetime.strptime(after2, '%Y-%m-%d') # 문자를 날짜로 변경
print('이 프로그램의 사용기간이',(lasttime-now).days,'일 남았습니다.')
058 예외처리 이해하기 ④ (try~except Exception as e)
코드에서 예외가 발생하면 이에 대한 자세한 내용을 파악하는 것이 중요합니다.
파이썬은 발생 가능한 예외에 대해 exception 객체로 미리 정의해 두고 있는데 이에 대한 내용은 다음 링크에서 확인할 수 있음.
http://docs.python.org/3/library/exceptions.html
Built-in Exceptions — Python 3.10.1 documentation
In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any exception classes derived from that class (but not exception cla
docs.python.org
위의 사이트에 보면 여러가지 다양한 에러에 대해서 미리 에러 처리를 할 수 있도록 정의해놓은 예외들을 확인할 수 있음.
> 이런 오류는 에러처리하지 말고 예외로 하자!
try:
x = int(input('분자의 숫자를 입력하세요~ '))
y = int(input('분모의 숫자를 입력하세요~ '))
print(x/y)
except ZeroDivisionError: #미리 정의해놓은 예외로 0으로 나누기 할때 작동
print('0으로 나눌 수는 없습니다.')
except:
print('잘못된 값을 입력하셨습니다.')
#하지만 파이썬 개발자들이 이 방법을 주로 쓰지 않고 아래와 같은 코드를 자주 사용함.
try:
x = int(input('분자의 숫자를 입력하세요~ '))
y = int(input('분모의 숫자를 입력하세요~ '))
print(x/y)
except Exception as e:
print(e) # 에러난 이유를 출력함
except:
print('잘못된 값을 입력하셨습니다.')
파이썬 개발자들이 내가 짠 코드의 문제점을 빠르게 파악하고자 할 때 사용
059 예외처리 이해하기 ⑤ (try~except 특정 예외)
파이썬 입장에서 봤을 때는 오류가 아닌데 프로그래머가 이건 오류니까 예외처리하도록 일부러 프로그램이 돌지 않도록 오류메시지를 출력하는 경우에 사용함.
ex) 큰 금액을 계산하는 파이썬 코드가 있는데 잘못 계산하면 안되니까 앞단에서 문제가 생기면 그냥 계산하지 말고 뒤에 남은 계산 코드를 돌리지 말고 그 자리에서 프로그램 중단시켜버려라~
프로그램 코드1
프로그램 코드2 <= 데이터 상의 문제로 오류 발생 프로그램 종료
프로그램 코드3 <= 수행 안됨
프로그램 코드4
문제209. emp2.csv를 판다스 데이터 프레임으로 만들어서 이름과 월급을 출력하시오.
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp[['ename','sal']]
문제210. 이름을 물어보게하고 이름을 입력하면 해당 사원의 이름과 월급이 출력되게 하시오
import pandas as pd
name = input('이름을 입력하세요~')
emp = pd.read_csv("c:\\data\\emp2.csv")
emp[['ename','sal']][emp['ename'] == name.upper()]
문제211. 위의 코드에 사용자 정의 예외처리를 해서 월급이 고소득자는 "해당 월급을 볼 수 없습니다. "라는 메세지가 출력되게 하시오.(월급 3000이상 = 고소득자)
import pandas as pd
name = input('이름을 입력하세요~')
emp = pd.read_csv("c:\\data\\emp2.csv")
result = emp['sal'][emp['ename'] == name.upper()].values[0]
# values를 넣어야 값이 나옴.
if result >= 3000:
raise Exception('해당 사원의 월급은 볼 수 없습니다.') # 오류가 나면서 프로그램 중단
else:
print(result)
raise Exception은 아예 에러가 나면서 프로그램을 중단시켜버리는 것.
보통은 파이썬 코드를 잘못 짜서 오류가 났으면 났지 데이터가 잘못돼서 오류가 나는 경우는 드물음. 이 경우는 개발자가 일부러 이건 오류다 라고 강제로 지정하는 것.
'Study > class note' 카테고리의 다른 글
python / type() (0) | 2021.12.20 |
---|---|
python / input (0) | 2021.12.20 |
python / 클래스(상속) (0) | 2021.12.20 |
python / 클래스(이해, 클래스 멤버/인스턴스 멤버, 메소드, 생성자, 소멸자) (0) | 2021.12.16 |
커피키오스크+ 클래스 생성+이미지 추가 (0) | 2021.12.16 |