파이썬 중급4

InSung-Na·2023년 1월 10일
0
post-thumbnail

해당 글은 제로베이스데이터스쿨 학습자료를 참고하여 작성되었습니다

📌예외

  • 문법적인 문제는 없으나 실행 중 예상하지 못한 문제

📝입력

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에 상속되어있음

Python Error document : https://docs.python.org/ko/3/tutorial/errors.html

📝입력

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

📌예외 처리

  • 실행 중 오류가 발생하면 프로그램이 정지하므로 예외가 발생했을 때에도 수행할 수 있도록 메뉴얼을 설정하는 것을 의미함

try~except

  • 예외가 발생하면 except 구문을 실행하고 다음 프로그램 수행

📝입력

n1 = 1; n2 = 0
try:
    result = n1 / n2
except:
    print('예상치 못한 오류가 발생했습니다')

print('{} + {} = {}'.format(n1, n2, n1 + n2))

🧾출력

예상치 못한 오류가 발생했습니다
1 + 0 = 1

except 예외지정:

  • 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

try~except~else

  • 예외가 발생하지 않으면 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

📌예외무관 항시실행 : finally

  • 예외와 무관하게 무조건 실행함

📝입력

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

📌오류확인 : Exception as e

  • 발생한 예외의 설명을 출력할 수 있음

아래의 오류는 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

📌강제오류발생 : raise

  • 강제로 오류를 발생시킵니다(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 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다
    (출처:제로베이스데이터스쿨)

로그인 예제

  • 비밀번호 5초과 10미만 사이의 비밀번호(admin1234) 맞추기

📝입력

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: 잘못된 비밀번호!!

0개의 댓글