파이썬 try-except의 기본과 응용, 그리고 에러 종류

개발공부를해보자·2025년 2월 27일

공부 정리

목록 보기
22/34

아래는 GPT를 이용하여 정리한 내용이다.

try-except의 사용 방법

def main():
    """
    [1] 기본 예외 처리
    - 사용자가 숫자를 입력하지 않거나 0을 입력하면 예외를 처리함.
    """
    try:
        num = int(input("숫자를 입력하세요: "))  # ValueError 가능성
        print(10 / num)  # ZeroDivisionError 가능성
    except ValueError:
        print("유효한 숫자를 입력하세요.")  # 숫자가 아닌 값 입력 시
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")  # 0 입력 시

    """
    [2] 여러 개의 예외를 한 번에 처리
    - ValueError 또는 ZeroDivisionError 발생 시 동일한 방식으로 처리함.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        print(10 / num)
    except (ValueError, ZeroDivisionError) as e:
        print(f"오류 발생: {e}")  # 예외 메시지를 출력함.

    """
    [3] 모든 예외 처리 (비추천)
    - Exception을 사용하면 모든 예외를 처리할 수 있지만,
      어떤 오류가 발생했는지 명확하지 않으므로 가급적 특정 예외를 처리하는 것이 좋음.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        print(10 / num)
    except Exception as e:
        print(f"예외 발생: {e}")  # 예외 메시지를 출력

    """
    [4] else와 finally 사용
    - else: 예외가 발생하지 않았을 경우 실행됨.
    - finally: 예외 발생 여부와 관계없이 무조건 실행됨.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        result = 10 / num
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")
    except ValueError:
        print("숫자를 입력하세요.")
    else:
        print(f"결과: {result}")  # 예외가 발생하지 않은 경우 실행
    finally:
        print("프로그램 종료")  # 항상 실행됨 (예외 여부와 관계없이)

    """
    [5] 사용자 정의 예외 발생
    - 특정 조건에서 강제로 예외를 발생시키고, 유효한 입력을 받을 때까지 반복 실행
    """
    while True:
        try:
            num = int(input("양수를 입력하세요: "))
            if num < 0:
                raise ValueError("음수는 입력할 수 없습니다.")  # 사용자 정의 예외 발생
            break  # 정상 입력이면 루프 종료
        except ValueError as e:
            print(f"오류 발생: {e}. 다시 입력하세요.")  # 에러 메시지 출력 후 다시 입력 요청

    """
    [6] 파일 처리와 예외 처리
    - 존재하지 않는 파일을 열려고 할 경우 FileNotFoundError 예외가 발생할 수 있음.
    - with open()을 사용하면 자동으로 파일이 닫히므로 finally에서 close()를 호출할 필요 없음.
    """
    try:
        with open("data.txt", "r") as file:
            content = file.read()
            print(content)
    except FileNotFoundError:
        print("파일을 찾을 수 없습니다.")

    """
    [7] except: (모든 예외를 잡지만 비추천)
    - 어떤 오류든 잡아버리므로 디버깅이 어렵고, 중요한 예외도 무조건 처리됨.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        print(10 / num)
    except:
        print("오류 발생!")  # 어떤 오류든 무조건 처리됨 (비추천)

    """
    [8] except Exception: ([7]보다는 낫지만 [9]가 더 좋음)
    - 모든 예외를 잡지만, KeyboardInterrupt, SystemExit 같은 중요한 예외는 제외됨.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        print(10 / num)
    except Exception as e:
        print(f"오류 발생: {e}")  # 예외 메시지를 출력하여 디버깅 가능

    """
    [9] 특정 예외를 명시적으로 처리 (가장 추천)
    - 예상 가능한 예외는 따로 처리하여 문제 원인을 명확하게 구분할 수 있음.
    """
    try:
        num = int(input("숫자를 입력하세요: "))
        print(10 / num)
    except ValueError:
        print("유효한 숫자를 입력하세요.")  # 숫자가 아닌 값을 입력했을 때
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")  # 0을 입력했을 때
    except Exception as e:
        print(f"예기치 않은 오류 발생: {e}")  # 예외 메시지를 출력하여 예기치 않은 오류도 대비 가능

if __name__ == "__main__":
    main()

주요 에러 종류

예외명설명
Exception모든 예외의 기본 클래스
SyntaxError문법 오류 발생 시 (예: print(1 2))
IndentationError들여쓰기 오류 발생
TypeError잘못된 타입 사용 (예: "3" + 3)
ValueError잘못된 값 사용 (예: int("abc"))
IndexError리스트, 튜플, 문자열의 잘못된 인덱스 접근
KeyError딕셔너리에 존재하지 않는 키 접근
ZeroDivisionError0으로 나누기 시도
FileNotFoundError존재하지 않는 파일 열기 시도
IOError파일 입출력 오류
AttributeError존재하지 않는 속성 접근
NameError정의되지 않은 변수 사용
ModuleNotFoundError존재하지 않는 모듈 import
MemoryError메모리 부족
OverflowError너무 큰 수 연산 시 발생
RecursionError재귀 호출이 너무 깊어질 때 발생
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글