[개발자 로드맵]/파이썬

[혼자 공부하는 파이썬] 예외 객체, 예외 강제 발생

Ramrider 2023. 9. 26. 11:23
728x90
반응형

예외 객체

# 누가 언제 어디서 무엇을 어떻게 왜?

# 프로그래밍에서도 예외가 발생하게 되었을 때
# 예외에 대한 정보를 담고 있는 객체가 예외 객채

try : 
    dasdasd[0]
    
except Exception as e:
    print(type(e))
    print(e)

#except 예외의 종류 as 예외_객체의_변수_이름:
    #NameError as e
    #IndexError as exception
    #ValueError
    #Exception : 초보자 단계에서는 예외 종류들을 모를 수 있는데,
    #이때 Exception은 모든 예외의 부모라서 이것을 사용하면 된다

 

# 예외 문법을 이런식으로 활용할 수 있다

try:
    [사용자로부터 어떤 입력을 받고, 네트워크로 그걸 전송하는 프로그램]
except Exception as e:
    if type(e) == ValueError:
        print("값을 다시 제대로 입력해주세요")
    elif type(e) == ConnectionError:
        print("인터넷 연결에 문제가 있습니다")
    else:
        i = input("오류 내용을 전송하시겠습니까?[Y/N]")
        if i in ["Y", "y"]:
            메일보내기(type(e), str(e))

 

# 예외 구분 문법
# 코드의 가독성이 떨어지기 떄문에 이런식으로 작성을 하게 된다

try:
    [사용자로부터 어떤 입력을 받고, 네트워크로 그걸 전송하는 프로그램]
except ValueError:
    print("값을 다시 제대로 입력해주세요")
except ConnectionError:
    print("인터넷 연결에 문제가 있습니다")
except Exception as e:
    i = input("오류 내용을 전송하시겠습니까?[Y/N]")
    if i in ["Y", "y"]:
        메일보내기(type(e), str(e))
        
# excpet Exception as e 는 가장 마지막에 위치해야한다.
# 가장 상단에 위치해버리면 밑에 except 구문들은 동작하지않는다.

# ValueError나 ConnectionError는 as e를 할 필요가 없으므로
# 생략하여도 무방

# 이렇게 되면 프로그램이 죽지 않는데,
# 좀비 프로그램은 죽는 것보다 더 위험하므로 조심해야한다.

 

예외 강제 발생
raise 구문

# raise 예외객체
# raise 예외객체()
# raise 예외객체(메시지)

raise Exception("예외를 강제로 발생시킵니다.")

 

활용 예(1): 미구현 상태 전달하기

# 왜 예외를 강제로 발생시키는 것일까?
# 활용 예(1) : 미구현 상태 전달하기

# 기본적으로 예외를 강제로 발생시키는 이유는
# 다른 개발자에게 정보를 전달하기 위해서 이다.
# 따라서 이번 활용 예는 미구현 상태 라는 정보를 전달하는 예 이다.

# 아래처럼 미구현된 부분을 pass로 작성해 놓으면
# 3자는 의도한 pass인지 아닌지 구분이 어렵다

number = input("정수 입력> ")
number = int(number)

if number > 0:
    print("양수입니다")    
elif number == 0:
    pass
else:
    pass

 

# 이런식으로 raise를 사용하여 명시적으로 표현이 가능하다

number = input("정수 입력> ")
number = int(number)

if number > 0:
    print("양수입니다")    
elif number == 0:
    raise Exception("아직 구현되지 않았습니다.")
else:
    raise Exception("아직 구현되지 않았습니다.")

 

# 이 구문은 많이 사용되기 때문에
# NotImplementedError라고 예외 객체가 만들어져 있음 
# 이때 장점은 코드 검색을 통해서 구현이 안된 곳을 빨리 찾을 수 있다.

number = input("정수 입력> ")
number = int(number)

if number > 0:
    print("양수입니다")    
elif number == 0:
    raise NotImplementedError("아직 구현되지 않았습니다.")
else:
    raise NotImplementedError("아직 구현되지 않았습니다.")

 

활용 예(2): 이렇게 하면 안된다 전달하기

# 활용 예(2): 이렇게하면 안된다 전달하기
# 사용자가 너비나 높이에 0이나 -1을 넣는 경우도 있다

def 사각형넓이구하기(너비, 높이):
    if 너비 <= 0 or 높이 <=0 :
        raise ValueError("너비와 높이는 양수여야합니다")
    return 너비 * 높이

print(사각형넓이구하기(0, -1))
728x90
반응형