01_Python

49_예외처리

chuuvelop 2025. 1. 15. 00:46
728x90
01. 예외처리의 필요성
  • 문제 발생으로 인해 프로그램이 비정상적으로 종료되는 것을 막고 발생한 문제에 대한 정보를 전달하기 위해 사용

try-except 문

  • 예외처리를 위한 기본 구조

      try:

            ...

 

      except [발생오류[as 오류 메시지 변수]]:

            ...

  • try 블록 실행 중 오류가 발생하면 except 블록이 실행됨
    • try 블록에서 오류가 발생하지 않는다면 except 블록은 실행되지 않음

 

02. 예외처리 방법
  • try, except만 쓰는 방법
  • 발생 오류만 포함한 except문
  • 발생 오류와 오류 메시지 변수까지 포함한 except문
# try, except만 쓰는 방법
try:
    4 / 0

except:
    print("error")
error

 

# 발생 오류만 포함한 except문
try:
    4 / 0

except ZeroDivisionError:
    print("zero division error")

except KeyError:
    print("key_error")
zero division error

 

 

# 발생 오류와 오류 메시지 변수까지 포함한 except문
try:
    4 / 0

except ZeroDivisionError as e:
    print(e)
division by zero
4 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[5], line 1
----> 1 4 / 0

ZeroDivisionError: division by zero
try:
    a = int(input("나누어지는 수를 입력 : "))
    b = int(input("나누는 수를 입력 : "))
    print(f"{a} / {b} = {a / b}")

except ZeroDivisionError as e:
    print(e)
    print("0으로 나눌 수 없습니다.")

except ValueError as e:
    print(e)
    print("정수만 입력할 수 있습니다")
나누어지는 수를 입력 :  1.5
invalid literal for int() with base 10: '1.5'
정수만 입력할 수 있습니다

 

else, finally 문

      try:

            코드 작성 영역

 

      except:

            예외 발생 시 처리 영역

 

      else:

             예외가 없을 때 처리 영역

 

      finally:

            언제나 실행되는 영역

 

try:
    a = int(input("나누어지는 수 : "))
    b = int(input("나누는 수: "))
    result = a / b

except Exception as e:
    print(e)

else:
    print(f"{a} / {b} = {result}")

finally:
    print("프로그램을 종료")
나누어지는 수 :  1.5
invalid literal for int() with base 10: '1.5'
프로그램을 종료

 

try, except, finally 구문의 조합

  • try 구문은 단독으로 사용할 수 없으며, 반드시 except구문 또는 finally 구문과 함께 사용해야 함
  • else 구문은 반드시 except구문 뒤에 사용해야 함
  • 가능한 조합
    • try + except
    • try + except + else
    • try + except + finally
    • try + except + else + finally
    • try + finally
  • 가능한 조합 외의 모든 조합은 구문 오류 발생
try:
    input_a = int(input("정수 입력 : "))
    print(input_a)

else:
    print("프로그램이 정상적으로 종료")
  Cell In[12], line 5
    else:
    ^
SyntaxError: expected 'except' or 'finally' block

 

finally 활용

# 파일이 제대로 닫혔는지 확인하기
try:
    f = open("info.txt", "w")
    예외.발생

except:
    print("오류가 발생했습니다")

finally:
    f.close()

print("file.closed : ", f.closed)
오류가 발생했습니다
file.closed :  True
# finally 구문을 사용하지 않고도 파일을 닫을 수 있음
try:
    f = open("info.txt", "w")
    예외.발생

except:
    print("오류가 발생했습니다")

f.close()

print("file.closed : ", f.closed)
오류가 발생했습니다
file.closed :  True

 

# try 구문 내부에서 return 키워드를 사용하는 경우
def test():
    print("test 함수의 첫 줄")

    try:
        print("try 구문 실행")
        return
        print("try 구문의 return 키워드 뒤")

    except:
        print("except구문 실행")

    else:
        print("else구문 실행")

    finally:
        print("finally 구문 실행")

    print("test 함수의 마지막 줄")
test()
test 함수의 첫 줄
try 구문 실행
finally 구문 실행

 

  • try 구문 중간에 return 으로 탈출해도 finally 가 실행됨
    • 함수 내부에서 파일 처리 코드를 깔끔하게 만들고 싶을 때 finally를 주로 활용
# 반복문과 finally를 사용하는 경우
print("프로그램 시작")

while True:
    try:
        print("try 구문 실행")
        break
        print("try 구문의 break 키워드 뒤")

    except:
        print("except 구문 실행")

    finally:
        print("finally 구문 실행")

    print("while 반복문의 마지막 줄")

print("프로그램 종료")

 

프로그램 시작
try 구문 실행
finally 구문 실행
프로그램 종료

 

강제로 예외 발생시키기

try:
    raise Exception("강제로 발생시킨 예외")

except Exception as e:
    print("발생한 예외 메시지는")
    print(e)
발생한 예외 메시지는
강제로 발생시킨 예외
raise Exception("강제로 발생시킨 예외")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
Cell In[20], line 1
----> 1 raise Exception("강제로 발생시킨 예외")

Exception: 강제로 발생시킨 예외

 

오류의 종류

  • 구문 오류(syntax error) : 프로그램 실행 전에 발생하는 오류
  • 런타임 오류(runtime error) : 프로그램 실행 중에 발생하는 오류

 

구문 오류

  • 괄호의 개수, 들여쓰기 문제 등으로 프로그램이 실행되기도 전에 발생하는 오류
    • 프로그램이 실행조차 되지 않기 때문에 예외처리로는 처리할 수 없음
    • 구문 오류가 발생한 코드를 수정해야함

 

# 프로그램 시작
print("프로그램 시작")

# 구문 오류 발생 코드
print("오류 발생"
  Cell In[22], line 5
    print("오류 발생"
                 ^
SyntaxError: incomplete input

 

런타임 오류

  • 프로그램 실행 중에 발생하는 오류
  • 예외 라고 함
print("프로그램 시작")

list_a[1] # 예외 발생 코드
프로그램 시작
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[23], line 3
      1 print("프로그램 시작")
----> 3 list_a[1]

NameError: name 'list_a' is not defined

 

조건문으로 예외 처리하기

# 숫자를 입력 받음
input_a = input("정수 입력: ")

# 숫자로 변환
number_input = int(input_a)

# 출력
print(number_input)
정수 입력:  hello
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[25], line 5
      2 input_a = input("정수 입력: ")
      4 # 숫자로 변환
----> 5 number_input = int(input_a)
      7 # 출력
      8 print(number_input)

ValueError: invalid literal for int() with base 10: 'hello'

 

# 숫자를 입력 받음
input_a = input("정수 입력: ")

# 사용자의 입력이 숫자로만 구성되어 있을 때
if input_a.isdigit(): # isdigit() : 숫자로만 구성된 글자인지 확인
    # 숫자로 변환
    number_input = int(input_a)
    
    # 출력
    print(number_input)

else:
    print("정수를 입력하지 않았습니다")
728x90