해당 글은 제로베이스데이터스쿨 학습자료를 참고하여 작성되었습니다
- 문법적인 문제는 없으나 실행 중 예상하지 못한 문제
📝입력
def div(n1, n2):
print(n1 / n2)
div(1 / 0)
🧾출력
Traceback (most recent call last):
File "C:\pythonEx\project\2_001\test2.py", line 28, in <module>
div(1 / 0)
~~^~~
ZeroDivisionError: division by zero
- 예외 관련 클래스는 Exception 클래스를 상속한다
(출처:제로베이스데이터스쿨)
- ZeroDivisionError : 어떤 값을 0으로 나누는 경우
- FileNotFoundError : 존재하지 않는 파일을 여는 경우
- IndexError : 인덱스 범위를 벗어난 오류
- Indentation Error : 들여쓰기 오류
- TypeError : 데이터 자료형이 잘못된 경우
- NameError : 정의되지 않은 변수를 사용하는 경우
- SyntaxError : 문법구조 오류
- ValueError : 부적절한 값을 인자로 받았을 때
그 외에도 많은 오류가 Exception에 상속되어있음
📝입력
def div(n1, n2):
print(n1 / n2)
div(1 / 0)
🧾출력
Traceback (most recent call last):
File "C:\pythonEx\project\2_001\test2.py", line 28, in <module>
div(1 / 0)
~~^~~
ZeroDivisionError: division by zero
- 실행 중 오류가 발생하면 프로그램이 정지하므로 예외가 발생했을 때에도 수행할 수 있도록 메뉴얼을 설정하는 것을 의미함
- 예외가 발생하면 except 구문을 실행하고 다음 프로그램 수행
📝입력
n1 = 1; n2 = 0
try:
result = n1 / n2
except:
print('예상치 못한 오류가 발생했습니다')
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
예상치 못한 오류가 발생했습니다
1 + 0 = 1
- except 뒤에 예외 클래스를 지정하여 해당 예외가 발생했을 시, 동작을 결정할 수 있다.
📝입력
n1 = 1; n2 = 0
try:
result = n1 / n2
except ZeroDivisionError:
print('0으로 나눌 수 없습니다')
except TypeError:
print('데이터 자료형의 오류가 발생했습니다')
except:
print('예상치 못한 오류가 발생했습니다')
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
0으로 나눌 수 없습니다
1 + 0 = 1
- 예외가 발생하지 않으면 else구문 실행
📝입력
n1 = 1; n2 = 5
try:
result = n1 / n2
except:
print('예상치 못한 오류가 발생했습니다')
else:
print('정상적으로 실행')
print('result : {}'.format(result))
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
정상적으로 실행
result : 0.2
1 + 5 = 6
- 예외와 무관하게 무조건 실행함
📝입력
n1 = 1; n2 = 0
try:
result = n1 / n2
except:
print('예상치 못한 오류가 발생했습니다')
else:
print('정상적으로 실행')
print('result : {}'.format(result))
finally:
print('무조건 수행합니다')
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
예상치 못한 오류가 발생했습니다
무조건 수행합니다
1 + 0 = 1
- 발생한 예외의 설명을 출력할 수 있음
아래의 오류는 SyntaxError로 문법구조 오류입니다
📝입력
n1 = 1; n2 = 0
try:
result = n1 / n
except Exception as e:
print('exception : {}'.format(e))
else:
print('정상적으로 실행')
print('result : {}'.format(result))
finally:
print('무조건 실행합니다')
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
exception : name 'n' is not defined
무조건 실행합니다
1 + 0 = 1
- 강제로 오류를 발생시킵니다(test용으로 사용)
📝입력
n1 = 10; n2 = 1
def div(n1, n2):
if n2 != 1:
print('{} / {} = {}'.format(n1, n2, n1/n2))
else:
raise Exception('예외를 강제로 발생시킵니다')
try:
div(n1, n2)
except Exception as e:
print('Exception : {}'.format(e))
print('{} + {} = {}'.format(n1, n2, n1 + n2))
🧾출력
Exception : 예외를 강제로 발생시킵니다
10 + 1 = 11
- Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다
(출처:제로베이스데이터스쿨)
로그인 예제
📝입력
class PasswordLengthShortException(Exception):
def __init__(self, str):
super().__init__('{}: 길이 5미만!!'.format(str))
class PasswordLengthLongException(Exception):
def __init__(self, str):
super().__init__('{}: 길이 10초과!!'.format(str))
class PasswordLengthWrongException(Exception):
def __init__(self, str):
super().__init__('{}: 잘못된 비밀번호!!'.format(str))
adminPw = input('input admin password: ')
try:
if len(adminPw) < 5:
raise PasswordLengthShortException(adminPw)
elif len(adminPw) > 10:
raise PasswordLengthLongException(adminPw)
elif adminPw != 'admin1234':
raise PasswordLengthWrongException(adminPw)
elif adminPw == 'admin1234':
print('로그인 되었습니다')
except PasswordLengthShortException as e1:
print(e1)
except PasswordLengthLongException as e2:
print(e2)
except PasswordLengthWrongException as e3:
print(e3)
🧾출력
input admin password: #JNE:FHAD
#JNE:FHAD: 잘못된 비밀번호!!