Language/Python

231127 Python 예외 사항, class, Except 상속

잇꼬 2023. 11. 27. 17:07
728x90
반응형
SMALL

■ 예외사항
    # 실행 중에 발생한 오류

def divide(x, y):
    return x/y

divide(10, 2)
divide(10, 3)
divide(10, 0) # 예상이름: 예상메세지 / ZeroDivisionError: division by zero
divide(10, "2") # 신텍스에러 = SyntaxError: invalid syntax. Perhaps you forgot a comma?
divide(10, "2") # 타입에러 = TypeError: unsupported operand type(s) for /: 'int' and 'str'


# try-except 

try:
    print(divide(10, 2)) # 실행중인 being절
except: # 정상적인 종료
    print("오류가 발생했습니다.")

    
# 계산 에러

try:
    print(divide(10, 0)) # 실행중인 being절
except: # 정상적인 종료
    print("오류가 발생했습니다.")


# 타입에러

try:
    print(divide(10, "0")) # 실행중인 being절
except: # 정상적인 종료
    print("오류가 발생했습니다.")


# PL/SQL : when 에러명 then sql쿼리문

try:
    print(divide(10, 0)) # 실행중인 being절
except ZeroDivisionError as err:
    print("0값으로 나눌 수 없습니다.", err) 
except TypeError as err:
    print("인수 값을 숫자로 입력해 주세요", err)


# 에러명 별칭 가능, 에러메세지 출력 가능

try:
    print(divide(10, "0")) # 실행중인 being절
except ZeroDivisionError as err:
    print("0값으로 나눌 수 없습니다.", err) 
except TypeError as err:
    print("인수 값을 숫자로 입력해 주세요", err)

    
# 실행 중 다른 오류를 출력하고 싶을 경우

try:
    print(divide(10, 2)) # 실행중인 being절
except ZeroDivisionError as err:
    print("0값으로 나눌 수 없습니다.", err) 
except TypeError as err:
    print("인수 값을 숫자로 입력해 주세요", err)    
except:
    print('오류가 발생했습니다.')


# try 절에 변수 처리 했을 경우

try:
    z = divide(10, 2)
except ZeroDivisionError as err:
    print("0값으로 나눌 수 없습니다.", err) 
except TypeError as err:
    print("인수 값을 숫자로 입력해 주세요", err)    
except:
    print('오류가 발생했습니다.')
else: # 문법적으로 except 절 뒤에 작성, 오류가 나지 않았을 때 실행되는 수행되는 절
    print("결과 : ", z)


# finally 절 = 오류와 상관없이 마지막에 실행

try:
    z = divide(10, 2)
except ZeroDivisionError as err: # ZeroDivisionError: 오류명
    print("0값으로 나눌 수 없습니다.", err) 
except TypeError as err:
    print("인수 값을 숫자로 입력해 주세요", err)    
except:
    print('오류가 발생했습니다.')
else: # 문법적으로 except 절 뒤에 작성
    print("결과 : ", z)
finally:
    print("프로그램 종료")


# PL/SQL 예외처리 : raise문
# 사용자가 정의한 예외 사항

def fun(arg):
    try:
        if arg < 1 or arg > 10:
            raise Exception
        else:
            print('입력한 수는 {} 입니다.'.format(arg))
    except Exception:
        print('오류가 발생했습니다.')
        
fun(0)
fun(5)
fun(20)


# 오류메시지 출력

def fun(arg):
    try:
        if arg < 1 or arg > 10:
            raise Exception("유효하지 않은 숫자입니다. {}".format(arg))
        else:
            print('입력한 수는 {} 입니다.'.format(arg))
    except Exception as error:
        print('오류가 발생했습니다.', error)
        
fun(0)
fun(5)
fun(20)


# 연습

def positive_divide(x,y):
    try:
        if y < 0:
            raise Exception('오류 - 음수로 나눌 수 없습니다. {}'.format(y))
        return x/y
    except TypeError as error:
        print('인수값을 숫자로 입력해 주세요.', error)
    except ZeroDivisionError as error:
        print('0으로 나눌 수 없습니다.', error)
    except Exception as error:
        print(error)

positive_divide(10, 2)
positive_divide(10, -2)


예외 사항 이름을 생성하는 방법
# 예외 class 생성

class NegativeDivisionError(Exception): # Exception을 상속 받기
    def __init__(self, value):
        self.value = value

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError(y)
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)

 

class NegativeDivisionError(Exception): # Exception을 상속 받기
    pass # 문법적으로 문장이 필요할 뿐, 아무것도 하지 않는 구문

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError(y)
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)


# raise 문에 값을 무조건적으로 삽입X

class NegativeDivisionError(Exception): # Exception을 상속 받기
    pass # 오류가 나와도 pass

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError()
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)


예외사항 이름의 해당하는 오류 메세지 생성
# PL/SQL => package(), package body() 선언 및 생성

class NegativeDivisionError(Exception): # Exception을 상속 받기
    def __init__(self):
        # exception 상속받기
        super().__init__('음수로 나눌 수 없습니다.')

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError()
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)


__str__  활용(스페셜 메소드)

class test:
    def __str__(self):
        return "오늘 하루도 열심히 공부하자!"
t = test()
print(t)
t.__str__()
print(test())


# super() 대신에 __str__ 예외처리 활용

class NegativeDivisionError(Exception): # Exception을 상속 받기
    def __str__(self):
        return '음수로 나눌 수 없습니다.'

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError()
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)


# error 오류번호 생성

class NegativeDivisionError(Exception): # Exception을 상속 받기
    def __str__(self):
        return 'error-2000, 음수로 나눌 수 없습니다.'

def positive_divide(x,y):
    if y < 0:
        raise NegativeDivisionError()
    return x / y 

positive_divide(10, 2)
positive_divide(10, -2)




728x90
반응형
LIST