에러는 프로그램이 실행되지 않도록 막는 심각한 문제를 의미합니다. 주로 프로그래머의 실수나 오류로 인해 발생하며, 에러가 발생하면 프로그램은 중단되고 더 이상 진행되지 않습니다. 예를 들어, 문법 오류(Syntax Error)는 코드에 문법적인 오류가 있을 때 발생하는 에러의 한 유형입니다.
예외는 프로그램이 실행 중에 발생할 수 있는 예상 가능한 오류를 의미합니다. 예외는 적절한 예외 처리를 통해 프로그램의 중단 없이 처리할 수 있습니다. 예를 들어, 파일을 열려고 했는데 해당 파일이 존재하지 않는 경우, 이는 예외로 간주되며 예외 처리를 통해 사용자에게 알려주거나 다른 조치를 취할 수 있습니다.
print("Hello, World!" # SyntaxError
result = "Hello" + 5 # TypeError
int("abc") # ValueError
with open("non_existent_file.txt", "r") as file:
content = file.read() # FileNotFoundError
예외 처리를 통해 프로그램은 예상치 못한 오류 상황에서도 안정적으로 실행될 수 있습니다. 이는 사용자 경험을 향상시키고, 데이터 손실이나 시스템 다운과 같은 심각한 문제를 방지하는 데 도움이 됩니다.
예외 처리 메커니즘은 개발자에게 오류에 대한 유용한 정보를 제공합니다. 이 정보를 활용하여 오류의 원인을 빠르게 파악하고 수정할 수 있어, 디버깅 과정이 간소화됩니다.
적절한 예외 처리를 통해 사용자에게 친숙하고 이해하기 쉬운 오류 메시지를 제공할 수 있습니다. 이는 사용자가 문제를 이해하고 필요한 경우 적절한 조치를 취할 수 있도록 돕습니다.
예외 처리는 프로그램의 유연성을 향상시킵니다. 다양한 오류 상황에 대응할 수 있게 되어, 프로그램은 다양한 환경과 조건에서도 효과적으로 작동할 수 있습니다.
try
, except
, else
, finally
구문을 사용해 예외처리를 할 수 있습니다. 다양한 예외 상황을 효과적으로 처리하고, 프로그램의 안정성과 유연성을 높일 수 있습니다.
try
블록은 예외가 발생할 가능성이 있는 코드를 포함합니다. 파이썬 인터프리터는 try
블록의 코드를 실행하다가 예외를 감지하면, 즉시 except
블록으로 이동합니다.
except
블록은 try
블록에서 예외가 발생했을 때 실행되는 코드를 포함합니다. 여러 except
블록을 사용하여 다양한 예외 유형을 처리할 수 있습니다.
else
블록은 try
블록이 예외 없이 성공적으로 실행되었을 때 실행되는 코드를 포함합니다. 이 블록은 선택적으로 사용할 수 있습니다.
finally
블록은 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함합니다. 이 블록은 주로 리소스를 정리하거나 종료 작업을 수행하는 코드를 포함합니다.
try: # 예외가 발생할 가능성이 있는 코드
result = 10 / 0
except ZeroDivisionError:# ZeroDivisionError 예외가 발생했을 때 실행될 코드
print("0으로 나눌 수 없음!")
else:# 예외가 발생하지 않았을 때 실행될 코드
print("나누기 성공!")
finally:# 예외 발생 여부와 관계없이 항상 실행될 코드
print("항상 실행")
try
블록에서 ZeroDivisionError 예외가 발생하므로, 해당 except
블록이 실행됩니다. finally
블록은 예외 발생 여부와 관계없이 항상 실행됩니다.
기본적으로 제공되는 예외 클래스 외에도 사용자가 직접 예외 클래스를 정의하여 사용할 수 있습니다. 사용자 정의 예외를 사용해서 더 적합한 예외 처리를 구현할 수 있습니다.
사용자 정의 예외 클래스를 생성하려면, Exception
클래스 또는 그 하위 클래스를 상속받아 새로운 클래스를 정의합니다. 클래스 내부에는 예외에 대한 설명을 반환하는 __str__
메서드를 포함할 수 있습니다.
# 사용자 정의 예외 클래스 정의
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyError 발생: {self.value}"
# 예외 발생 시키기
try:
raise MyError("에러발생")
except MyError as e:
print(e)
MyError
는 사용자 정의 예외 클래스로, Exception
클래스를 상속받아 정의하였습니다. try
블록 내에서 raise
키워드를 사용하여 MyError
예외를 발생시키고, except
블록에서 이를 처리합니다.
사용자 정의 예외는 프로그램의 특정 부분에서만 발생하는 예외, 특정 로직에 관련된 예외 처리, 또는 프로그램의 도메인에 맞는 예외 처리를 구현할 때 유용합니다.
파일에서 데이터를 읽어와서 정수로 변환한 후, 그 합계를 계산하는 프로그램을 작성해보겠습니다. 하지만 파일이 존재하지 않거나, 파일 내용 중 정수로 변환할 수 없는 데이터가 포함되어 있을 수 있습니다.
이러한 예외 상황을 처리하기 위해 try
, except
블록을 사용하고, 사용자 정의 예외를 활용하여 더 구체적인 예외 처리를 구현합니다.
class InvalidDataError(Exception):
"""사용자 정의 예외 - 데이터가 유효하지 않을 때 발생"""
pass
def read_and_sum(filename):
try:
with open(filename, 'r') as file:
data = file.readlines()
total = 0
for item in data:
try:
total += int(item.strip())
except ValueError:
raise InvalidDataError(f"유효하지 않은 데이터가 있습니다.: {item.strip()}")
print(f"Total sum: {total}")
except FileNotFoundError:
print(f"'{filename}'이 존재하지 않습니다.")
except InvalidDataError as e:
print(e)
# 파일 이름을 변경하여 FileNotFoundError와 InvalidDataError를 테스트
read_and_sum("data.txt")
InvalidDataError
는 사용자 정의 예외로, 데이터가 유효하지 않을 때 발생시킵니다.read_and_sum
함수는 파일을 읽고 데이터를 정수로 변환하여 합계를 계산합니다.try
블록 내에서 파일을 열고 데이터를 읽습니다. 만약 파일이 존재하지 않으면 FileNotFoundError
가 발생합니다.ValueError
가 발생할 수 있습니다. 이 경우 InvalidDataError
사용자 정의 예외를 발생시켜 구체적인 오류 메시지를 제공합니다.try
, except
블록을 사용하여 처리했습니다. 사용자 정의 예외 InvalidDataError
를 통해 더 구체적인 오류 메시지를 제공하였습니다.