파이썬 예외 처리(Exception) 코드의 안정성을 높이는 방법

천둥상어

·

2023. 12. 14. 00:10

반응형

파이썬_예외처리_썸네일

"코딩을 하다 보면 예상치 못한 에러가 발생하곤 합니다.

예를 들어 불러오는 파일이 존재하지 않거나, 데이타 타입이 불일치 하거나, 네트워크 지연에 따른 오류 등 말이죠.

이러한 에러 발생시 어떠한 에러인지 확인하고 예외 처리를 해줘야 사용자에게 좋은 경험을 줄 수 있습니다."

 

기본적인 예외 처리 구문

아래 코드에서는 의도적으로 ZeroDivisionError를 발생 시킵니다.

ZeroDivisionError는 파이썬에서 0으로 나누려고 할 때 발생하는 내장 예외 중 하나 입니다.

즉, 어떤 수를 0으로 나누는 연산을 시도할 때 발생하는 에러 입니다.

수학적으로 유효하지 않기 때문이죠.

result = 10 / 0  # ZeroDivisionError 발생

이제 이 코드에서 예외 처리를 추가해 보겠습니다.

아래 코드는 try문 블록에서 ZeroDivisionError 가 발생하면 어떠한 에러인지 출력하게 예외 처리 합니다.

try:
    # 예외가 발생할 수 있는 코드 블록
    result = 10 / 0
except ZeroDivisionError as e:
    # ZeroDivisionEroor가 발생했을 때 실행되는 코드 블록
    print(f"Error: {e}")

그리고 ZeroDivisionError 처럼 예상 할 수 있는 에러가 아닌 경우의 예외도 추가해 봅니다.

정의 되지 않은 a 라는 변수에 10을 더해서 result 에 대입해 주었습니다.

결과는 "Unexpected Error: name 'a' is not defined"가 출력이 됩니다.

try:
    # 예외가 발생할 수 있는 코드 블록
    result = 10 + a
except ZeroDivisionError as e:
    # ZeroDivisonError가 발생했을 때 실행되는 코드 블록
    print(f"Error: {e}")
except Exception as e:
    print(f"Unexpected Error: {e}") #Unexpected Error: name 'a' is not defined

지금까지는 try문 코드에서 문제 발생시 예외 처리 하는것만 알아보았습니다.

이제 예외가 발생하지 않는 경우도 처리를 해야 겠죠?

'else' 문은 예외가 발생하지 않았을 때 실행되는 코드 블록 입니다.

try문내 result에 정상적인 값을 대입하고 실행시키면 "No Error~"가 출력되는 것을 확인할 수 있습니다.

try:
    # 예외가 발생할 수 있는 코드 블록
    result = 10
except ZeroDivisionError as e:
    print(f"Error: {e}")
except Exception as e:
    print(f"Unexpected Error: {e}")
else :
    print("No Error~") 
    
#No Error~

마지막으로 예외 처리 발생 여부를 떠나 항상 실행되는 코드 구문을 보겠습니다.

finally 문은 예외 처리 상관 없이 항상 실행되는 코드 구문입니다.

"No Error~""Finally"가 순차적으로 출력 됩니다.

try:
    # 예외가 발생할 수 있는 코드 블록
    result = 10
except ZeroDivisionError as e:
    print(f"Error: {e}")
except Exception as e:
    print(f"Unexpected Error: {e}")
else :
    print("No Error~")
finally:
    print("Finally")
    
#No Error~
#Finally

 

반응형

 

예외 처리 구문 정리

  • try : 예외가 발생할 수 있는 코드를 포함하는 블록.
  • except :예외가 발생했을 때 실행되는 블록으로 범용적으로 처리 하거나 특정 예외 타입을 지정할 수 있음.
  • else : 예외가 발생하지 않았을 때 실행되는 블록
  • finally :  예외 발생 여부와 상관엇이 항상 실행되는 블록

 

사용자 정의 예외

예외는 개발자가 직접 정의해서 사용할 수도 있습니다.

class CustomError(Exception):
    def __init__(self, message="Custom error msg"):
        self.message = message
        super().__init__(self.message)

try:
    raise CustomError("Error Type : 0")
except CustomError as e:
    print(e)

위 코드는 Exception을 상속 받는 사용자 정의 예외 클래스를 만들어서 에러 메세지를 보여주는 코드 입니다.

try문에서 rasie로 의도적으로 예외를 발생시켰고, 클래스 생성시 에러 메세지를 넘깁니다.

결과는 "Error Type : 0" 가 출력 됩니다.

 

마치며

예외 처리는 코드의 신뢰성을 높이고 예기치 못한 문제에 대처 할 수 있습니다.

예외 발생시 앱이 다운되거나 꺼지는 것보다는 어떠한 에러인지 팝업으로라도 보여주는게 좋습니다.

반응형