5 분 소요



[점프 투 파이썬↗️]을 바탕으로 정리한 글입니다.



1. 예외 처리 개요

1.1 예외 처리란?

프로그램이 동작중에 발생하는 오류로 인해 프로그램이 정지 되지 않도록 방어적인 방법을 말한다.


1.2 오류는 언제 발생하는가?

# 파일이 없을 때 발생하는 오류
f = open("나없는파일", 'r')  # FileNotFoundError

# 0으로 나눌 때 발생하는 오류
4 / 0  # ZeroDivisionError

# 리스트 인덱스 초과 시 발생하는 오류
a = [1, 2, 3]
a[3]  # IndexError



2. 오류 예외 처리 기법

오류 처리 구문은 조건문이랑 거의 구조가 비슷하다.

try:
  # 오류가 발생할 수 있는 구문
except Exception as e:
  # 오류 발생하면 실행
else:
  # 오류 발생하지 않음
finally:
  # 무조건 마지막에 실행

아래 목차에서 하나씩 알아보도록 하자


2.1 try-except 문

try:
    ...
except [발생오류 [as 오류변수]]:
    ...
# try-except.py
try:
    a = [1, 2]
    print(a[3])
    4/0
except ZeroDivisionError as e:
    print("0으로 나눌 수 없습니다.")
    print(e)
except IndexError as e:
    print("인덱싱 할 수 없습니다.") # 인덱싱 할 수 없습니다.
    print(e) # list index out of range


2.2 try-except-else 문

try:
  (...)
except:
  (...)
else:
  (...) # 에러의 발생 없는 경우, 실행

# try-except-else.py
try:
    x = int(input("10을 나눌 숫자를 입력: "))
    y = 10 / x
except ZeroDivisionError: # 에러가 발생했을 때 실행
    print("0으로 나누는 것은 불가")
else: # 예외가 발생하지 않았을 때 실행
    print(y)
# try_else.py
try:
    age=int(input('나이를 입력하세요: '))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')


2.3 try-except-finally 문

# try-except-finally
try:
  (...)
except:
  (...)
finally:
  (...) # 중간에 오류가 발생하더라도 무조건 실행
# try-except-finally.py
try:
    a = [1, 2]
    print(a[3])
    4/0
except Exception as e:
    print("에러 발생: ", e) # 에러 발생:  list index out of range
finally:
    print("정상 종료합니다.") # 정상 종료합니다.


2.4 try-except-else-finally 문

try:
  (...)
except:
  (...)
else:
  (...)
finally:
  (...) # 무조건 마지막에 실행
# try-except-else-finally.py
try:
    x = int(input("10을 나눌 숫자를 입력: "))
    y = 10 / x
except ZeroDivisionError: # 에러가 발생했을 때 실행
    print("0으로 나누는 것은 불가")
else: # 예외가 발생하지 않았을 때 실행
    print(y)
finally: # 예외 발생과 상관 없이 항상 실행
    print("코드 실행 종료")



3. 오류 회피하기

코드를 작성하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있을 때, 아래와 같이 pass를 사용하여 오류를 회피할 수 있다.

# error_pass.py
try:
    f = open("나없는파일", 'r')
except FileNotFoundError:
    pass



5. 예외 만들기

예외도 클래스이다.사용자 정의 예외를 만들려면 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.

# error_make.py

# 사용자 정의 예외 클래스
class MyError(Exception):
    def __str__(self):
        return "허용되지 않는 별명입니다."

# 예외를 발생시키는 함수
def say_nick(nick):
    if nick == '바보':
        raise MyError()  # MyError 예외를 발생시킴
    print(nick)

# 예외 처리
try:
    say_nick("천사")
    say_nick("바보")  # 이 부분에서 예외가 발생
except MyError as e:
    print(e)  # "허용되지 않는 별명입니다." 출력
  • MyError 클래스는 Exception을 상속받아 사용자가 정의한 예외 클래스이다.
  • __str__ 메서드는 print(e)처럼 오류 메시지를 print 문으로 출력할 경우에 호출되는 메서드이다.
  • say_nick 함수는 ‘바보’라는 별명이 들어오면 MyError 예외를 발생시킨다.



6. 연습 문제

6.1 try-except 문

사용자에게 두 숫자를 입력받아 나누기를 수행하는 프로그램을 작성하세요.

첫 번째 숫자를 0으로 나누려고 할 때 ZeroDivisionError가 발생하면, 오류 메시지를 출력하세요. 그 외의 오류가 발생할 경우 “알 수 없는 오류가 발생했습니다.”라고 출력하세요.

try:
  num1 = int(input("첫 번쨰 숫자: "))
  num2 = int(input("두 번쨰 숫자: "))
  result = num2 / num1
  print(f"결과: {result}")
except ZeroDivisionError:
  print("0으로 나눌 수 없습니다.")
except Exception as e:
  print("알 수 없는 오류가 발생했습니다.")


사용자로부터 숫자 3개를 입력받아 리스트에 저장한 후, 이 리스트에서 인덱스 3의 값을 출력하는 프로그램을 작성하세요.

  • (인덱스가 범위를 벗어난 경우 IndexError가 발생할 것입니다.)
  • IndexError가 발생하면 “리스트 인덱스가 범위를 벗어났습니다.”라는 메시지를 출력하세요.
try:
  numbers=[]
  for i in range(3):
      numbers.append(int(input(f"{i+1}번째 숫자를 입력하세요: ")))
  print(numbers[3])
except IndexError:
  print("리스트가 인덱스 범위를 벗어났습니다.")


배열에서 요소 3을 출력하는 프로그램을 작성하세요. 요소 3이 없다면 “존재하지 않는 숫자입니다.”를 출력하세요.

  • 리스트 a는 [1, 2, 3]으로 고정되어 있습니다.
  • 사용자는 0, 1, 2 중 하나의 값을 입력해야 합니다. 만약 이 외의 값을 입력하면 IndexError가 발생합니다.
  • IndexError가 발생했을 경우, “존재하지 않는 숫자입니다.”라는 메시지를 출력하도록 하세요.
try:
  a=[1,2,3]
  num=int(input())
  value=a[num]
  print(f"입력한 인덱스 {num}에 해당하는 값은: {value}")
except IndexError:
  print("존재하지 않는 숫자입니다.")


6.2 try-except-else 문

사용자로부터 나이를 입력받는 프로그램을 작성하세요.

  • 입력 값이 숫자가 아닌 경우 ValueError가 발생하므로 이를 처리하여 “잘못된 입력입니다.”라는 메시지를 출력하세요.
  • 나이가 18세 이하인 경우 “미성년자입니다.”를 출력하고, 19세 이상인 경우 “성인입니다.”를 출력하세요.
try:
  age=int(input("나이를 입력하세요: "))
except ValueError:
  print("유효한 나이를 입력하세요.")
else:
    if(age>=18):
      print("성인")
    else:
      print("미성년자")


사용자에게 두 숫자를 입력받아 나누기를 수행하는 프로그램을 작성하세요.

첫 번째 숫자를 0으로 나누려고 할 때 ZeroDivisionError가 발생하면, 오류 메시지를 출력하세요. 그 외의 오류가 발생할 경우 “알 수 없는 오류가 발생했습니다.”라고 출력하세요.

try:
  num1 = int(input("첫 번쨰 숫자: "))
  num2 = int(input("두 번쨰 숫자: "))
  result = num2 / num1
except ZeroDivisionError:
  print("0으로 나눌 수 없습니다.")
except Exception as e:
  print("알 수 없는 오류가 발생했습니다.")
else:
  print(f"결과: {result}")


6.3 try-except-finally 문

test.txt 파일을 열고 내용을 출력하려고 할 때, 파일이 없으면 오류 메시지를 출력하고, 파일을 닫는 코드가 항상 실행되도록 예외 처리를 해보세요.

try:
    file = open("test.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    try:
        file.close()
    except NameError:
        pass  # 파일을 열지 못한 경우 예외 처리


사용자로부터 두 숫자를 입력받아 덧셈을 하고 결과를 출력하는 프로그램을 작성하세요.

  • 입력이 잘못되면 예외를 처리하여 “잘못된 입력입니다.”를 출력하고, 입력이 올바른 경우 덧셈 결과를 출력하세요.
  • 이와 상관없이 마지막에 “프로그램 종료” 메시지가 출력되도록 하세요.
try:
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    result = num1 + num2
except Exception:
    print("잘못된 입력입니다.")
else:
    print("덧셈 결과: ", result)
finally:
    print("프로그램 종료")


6.4 try-except-else-finally 문

사용자가 입력한 파일명을 열고, 파일이 존재하면 내용을 출력하며, 존재하지 않으면 오류 메시지를 출력하세요. 프로그램이 끝날 때 “작업 완료” 메시지가 출력되도록 예외 처리를 해보세요.

try:
    filename = input("파일명을 입력하세요: ")
    file = open(filename, "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("파일을 열 수 없습니다.")
else:
    print("파일 읽기 성공")
finally:
    print("작업 완료")


사용자로부터 숫자 두 개를 입력받아 나누기를 수행하는 프로그램을 작성하세요.

  • 사용자로부터 숫자 두 개를 입력받아 나누기를 수행하는 프로그램을 작성하세요.
  • 입력된 두 숫자가 모두 유효하다면 결과를 출력하고, 0으로 나누기를 시도하면 ZeroDivisionError가 발생하므로 이를 처리합니다.
  • 에러가 발생하지 않으면 결과를 출력하고, 발생한 경우에는 오류 메시지를 출력하세요.
  • 마지막에는 반드시 “코드 실행 종료”라는 메시지를 출력하세요.
try:
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    result = num1 / num2
except ZeroDivisionError:
    print("0으로 나누는 것은 불가")
else:
    print("결과는: ", result)
finally:
    print("코드 실행 종료")


카테고리:

업데이트:

댓글남기기