본문 바로가기
Base/Python

22. 예외 처리의 else finally 구문 / 예외 객체와 예외 구분 / 예외 강제 발생

by 귀멸 2023. 3. 25.

혼공파 75 ~ 77강

1. 예외 처리의 else finally 구문 

try:
    # 예외가 발생할 가능성이 있는 코드
    pass
except:
    # 예외가 발생했을 때 실행할 코드
    pass
else:
    # 예외가 발생하지 않았을 때 실행할 코드
    pass
finally:
    # 무조건 실행하는 코드
    pass

# 위의 순서대로 코드를 짜고, 보통 try-except / try-except-finally 조합으로 사용한다.

try:
    # 예외가 발생할 가능성이 있는 코드
    숫자입력 = int(input("정수 입력>"))
except:
    # 예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")
else:
    # 예외가 발생하지 않았을 때 실행할 코드
    print("원의 반지름: ", 숫자입력)
    print("원의 둘레: ", 2 * 3.14 * 숫자입력)
    print("원의 넓이: ", 3.14 * (숫자입력**2))

# else구문을 사용하지 않고 try 구문에 실행할 코드를 넣어도 무방
# 파이썬에만 있는 문법임

try:
    # 예외가 발생할 가능성이 있는 코드
    숫자입력 = int(input("정수 입력>"))
    # 예외가 발생하지 않았을 때 실행할 코드
    print("원의 반지름: ", 숫자입력)
    print("원의 둘레: ", 2 * 3.14 * 숫자입력)
    print("원의 넓이: ", 3.14 * (숫자입력**2))
except:
    # 예외가 발생했을 때 실행할 코드
    print("정수를 입력하지 않았습니다.")
finally:
    # 무조건 실행하는 코드 (예외가 발생하거나, 안하거나)
    print("무조건 실행되는 코드입니다.")

def 함수():
    print("함수()에 진입했습니다.")
    try:
        print("try 구문에 진입했습니다.")
        return
        print("try 구문이 끝났습니다.")
    except:
        print("except 구문에 진입했습니다.")
    finally:
        print("finally 구문에 진입했습니다.")
    print("함수()가 끝났습니다.")

# return 키워드로 함수가 종료되도 finally 구문안에 코드는 실행이 된다.

 

finally 구문 활용 예

# 사용자로부터 파일 이름을 입력 받고
# 그 파일의 내용을 int() 함수로 정수로 변환 뒤 출력하는 프로그램

def 함수(파일이름):
    try:
        파일 = open(파일이름, "r")
        내용 = 파일.read()
        숫자 = int(내용)
        return 내용
    except FileExistsError:
        print("존재라지 않는 파일입니다.")
    except ValueError:
        print("숫자로 변환할 수 없는 파일입니다.")
    finally:
        파일.close()

파일이름 = input("파일 이름> ")
print(함수(파일이름))
# 함수 안에서 예외처리에 상관 없이 finally 키워드를 이용해 파일을 닫아줄 수 있다.

2. 예외 객체와 예외 구분

#  예외 객체: 예외와 관련된 정보를 담고 있는 객체
# try:
#    dasdasasf[0]
# except 예외의_종류 as 예외_객체의_변수_이름:
    # NameError
    # IndexError
    # ValueError
    # -> Exception (모든 예외 포함)

try:
    dasdasasf[0]
except Exception as e:
    print(type(e))  # <class 'NameError'>
    print(e)        # name 'dasdasasf' is not defined

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

3. 예외 강제 발생 raise Exception()

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

# 코드 미구현 상태를 명시적으로 표현함에 사용
number = input("정수 입력> ")
number = int(number)

if number > 0:
    print("양수 입니다")
elif number == 0:
    raise Exception("아직 구현되지 않았습니다.")
else:
    raise NotImplementedError("아직 구현되지 않았습니다.")
# 미구현 코드는 예외 객체로 들어가 있음


# 이렇게 하면 안된다 전달하기
def 사각형넓이구하기(너비, 높이):
    if 너비 <= 0 or 높이 <= 0:
        raise  ValueError("너비와 높이는 양수여야합니다.")
    return 너비 * 높이

print(사각형넓이구하기(0, -1))

 

github에서 작성된 코드 검색해서 살펴보는 것으로 감각 익히기

댓글