[python] 예외처리

728x90

1. 예외의 종류

SyntaxError : 문법 오류
NameError : 참조가 없을 때
ZeroDivisionError : 0으로 나누려고 할때 발생하는 예외
IndexError : 리스트 등 인덱스 범위를 벗어났을때 발생하는 예외
KeyError: 딕셔너리 등 없는 key값을 찾으려고 할때 발생하는 예외
AttributeError : 모듈, 클래스등에 있는 잘못된 속성을 사용 하려고 할때 발생하는 예외
ValueError: 어떤 자료구조 안에서 특정값을 처리하려고 하는데 특정값이 존재하지 않을 때 발생하는 예외
FileNotFoundError : 파일을 찾으려고 하는데, 해당 파일명이 없을 때 발생하는 예외
TypeError :  자료형에 맞지 않는 연산을 수행하려고 할때 발생하는 예외

2. try 예외처리

예외 처리는 프로그램 실행 중에 발생할 수 있는 예외 상황에 대비하여 오류를 감지하고 처리하는 기능을 말합니다. 예외 처리를 통해 프로그램이 비정상적으로 종료되는 것을 방지하고, 예외 상황에서 적절한 조치를 취할 수 있습니다.

 

파이썬에서 예외 처리는 try, except 블록을 사용하여 구현합니다. try 블록에는 예외가 발생할 수 있는 코드를 작성하고, except 블록에는 예외가 발생했을 때 처리할 코드를 작성합니다.

 

try:
    num = int(input("숫자를 입력하세요: "))
    result = 10 / num
    print("결과:", result)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except ValueError:
    print("올바른 숫자를 입력해주세요.")
except Exception as err:
    print(err) #위 내용 외의 에러 내용 출력

 

위의 코드에서 try 블록에서 사용자로부터 숫자를 입력받고, 10으로 나누는 연산을 수행합니다. 이때, 만약 사용자가 0을 입력하거나 숫자가 아닌 값을 입력하면 예외가 발생합니다. 이러한 예외 상황에 대비하여 except 블록에서 적절한 오류 메시지를 출력하고 처리합니다.
그리고 Exception 클래스를 이용하면 지정된 에러외의 다른 에러들을 처리할 수 있습니다.

Exception 클래스란?

더보기

파이썬에서 Exception은 모든 내장 예외 클래스의 기본 클래스로서, 사용자 정의 예외 클래스를 만들 때도 주로 상속하는 기본 예외 클래스입니다. 모든 내장 예외 클래스들은 Exception 클래스를 상속받아서 구현되어 있습니다.

Exception 클래스는 일반적으로 프로그램 실행 중에 발생하는 예외 상황들을 처리하기 위한 기본적인 예외 클래스입니다. 파이썬에서 발생할 수 있는 대부분의 예외는 Exception 클래스 또는 이를 상속받은 하위 클래스들로 구현되어 있습니다.

3. else

파이썬 예외처리에서 else는 try블록에서 예외가 발생하지 않을 경우 실행합니다. 즉 try안의 코드가 정상적으로 실행되어야 else문이 실행됩니다.

try:
    num = int(input("숫자를 입력하세요: "))
    result = 10 / num
    print("결과:", result)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except ValueError:
    print("올바른 숫자를 입력해주세요.")
except Exception as err:
    print(err) #위 내용 외의 에러 내용 출력
else:
    print("try 실행 후 else")

4.raise문

파이썬에서는 raise 문을 사용하여 직접 에러를 발생시킬 수 있습니다. 이를 통해 특정 상황에서 프로그래머가 원하는 예외를 일부러 발생시킬 수 있습니다. raise 문은 raise 키워드 다음에 예외 클래스를 지정하여 사용합니다.

 

def positive_number(num):
    if num < 0: #입력값이 0보다 작은 경우 에러 발생시킴
        raise ValueError("음수는 입력할 수 없습니다.")
    return num

try:
    num = int(input("양수를 입력하세요: "))
    result = positive_number(num)
    print("결과:", result)
except ValueError as e:
    print("에러 발생:", e)

출력)

5. 사용자 정의 에러

파이썬에서는 사용자가 직접 예외 클래스를 정의하여 사용자정의 에러 처리를 구현할 수 있습니다. 사용자정의 예외 클래스는 내장된 예외 클래스와 마찬가지로 Exception 클래스를 상속받아서 만듭니다.

사용자정의 예외 클래스를 만들 때는 보통 Exception 클래스를 상속받고, 필요에 따라 추가적인 속성이나 메서드를 정의할 수 있습니다. 사용자정의 예외 클래스는 주로 프로그램에서 특정 상황에 해당하는 예외를 발생시키고 싶을 때 사용됩니다.

 

class PlusNumError(Exception):
    def __init__(self, msg):
        self.msg = msg
    
    def __str__(self):
        return self.msg        
        

def positive_number(num):
    if num < 0: #입력값이 0보다 작은 경우 에러 발생시킴
        raise PlusNumError("입력값 : {0}".format(num))
    return num

try:
    num = int(input("양수를 입력하세요: "))
    result = positive_number(num)
    print("결과:", result)
except ValueError as e:
    print("에러 발생:", e)
    
except PlusNumError as err: #사용자 정의 에러
    print("양수만 입력가능합니다.")
    print(err)

 

6. finally

finally는 정상적으로 실행되든 오류가 발생하든 무조건 실행되는 구문입니다.

 

class PlusNumError(Exception):
    def __init__(self, msg):
        self.msg = msg
    
    def __str__(self):
        return self.msg        
        

def positive_number(num):
    if num < 0: #입력값이 0보다 작은 경우 에러 발생시킴
        raise PlusNumError("입력값 : {0}".format(num))
    return num

try:
    num = int(input("양수를 입력하세요: "))
    result = positive_number(num)
    print("결과:", result)
except ValueError as e:
    print("에러 발생:", e)
    
except PlusNumError as err: #사용자 정의 에러
    print("양수만 입력가능합니다.")
    print(err)
finally:
    print("실행끝")

 

7.예외반복

while True:
    try:
        num = int(input("숫자를 입력하세요: "))
        result = 10 / num
        print("결과:", result)
        break
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")
    except ValueError:
        print("올바른 숫자를 입력해주세요.")
    except Exception as err:
        print(err) #위 내용 외의 에러 내용 출력

 

위 코드처럼 무한 반복문을 사용하면 제대로 된 결과가 나올때까지 반복할 수 있습니다.

당연히 try문 안에 break가 있어야 원하는 결과가 나왔을때 반복이 종료됩니다.

'PYTHON Programming > Python' 카테고리의 다른 글

[python] 내장함수  (0) 2024.05.21
[python] 패키지와 모듈  (0) 2024.05.21
[python] print와 pass  (0) 2024.05.21
[python] 상속  (0) 2024.05.20
[python] 메서드  (0) 2024.05.20