프로그램을 만들다 보면 수없이 많은 오류를 만나게 됩니다.
물론 오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 파이썬의 배려입니다.
이번에는 파이썬에서 오류를 처리하는 방법에 대해서 알아봅시다
예외 처리(Exception Handling)는 프로그램이 실행되는 동안 예기치 않은 상황(예외)이 발생했을 때,
프로그램이 비정상적으로 종료되는 것을 방지하고 프로그램의 안정성을 높이기 위해 사용되는 프로그래밍 기법입니다.
프로그램에서 발생할 수 있는 예외적인 상황들은 다양합니다.
일반적인 예외 사례로는 파일을 찾을 수 없거나,
0으로 나누는 연산을 수행하려고 할 때 발생하는 ZeroDivisionError 등이 있습니다.
이러한 예외적인 상황들이 발생했을 때, 프로그램이 종료되는 것은
사용자에게 부적절하고 프로그램의 안정성을 해치는 결과를 초래할 수 있습니다.
오류가 발생하는 여러가지 유형
프로그램에서 발생할 수 있는 다양한 종류의 오류가 있습니다.
이러한 오류들은 예외(Exceptions)라고도 불리며, 예외 처리(Exception Handling)를 통해 처리될 수 있습니다.
주요 프로그램 오류 유형은 다음과 같습니다:
구문 오류(Syntax Error)
코드가 잘못된 문법을 가지고 있을 때 발생합니다. 대표적으로 오타, 들여쓰기 오류 등이 포함됩니다.
이러한 오류는 코드를 실행하기 전에 발견되며, 프로그램이 실행되지 않습니다.
런타임 오류(Runtime Error)
프로그램이 실행되는 도중에 발생하는 오류로, 예외 처리를 통해 처리될 수 있습니다.
주로 사용자 입력 또는 외부 데이터에 의해 발생하는 경우가 많습니다.
대표적인 런타임 오류 유형으로는 다음과 같은 것들이 있습니다:
- ZeroDivisionError: 0으로 나누기 연산 시 발생합니다.
- NameError: 정의되지 않은 변수나 함수를 참조할 때 발생합니다.
- TypeError: 데이터 타입이 잘못 사용되었을 때 발생합니다.
- ValueError: 데이터 값이 잘못된 경우 발생합니다.
- FileNotFoundError: 파일을 찾을 수 없을 때 발생합니다.
논리 오류(Logical Error)
프로그램이 예상한 대로 동작하지 않는 오류로, 문제를 발견하기가 어려울 수 있습니다.
이러한 오류는 프로그램의 논리적인 부분에 있으며, 예외 처리를 통해 처리되지 않습니다.
따라서 프로그래머가 코드를 재검토하여 수정해야 합니다.
이러한 프로그램 오류들은 예외 처리를 통해 프로그램이 비정상적으로 종료되는 것을 방지하고, 프로그램의 안정성을 높이기 위해 처리됩니다.
다양한 예외처리 기법
파이썬에서는 예외 처리를 위해 다음과 같은 키워드와 구문을 사용합니다:
- try: 예외가 발생할 가능성이 있는 코드 블록을 지정합니다.
- except: 예외가 발생했을 때 처리할 코드 블록을 지정합니다. 예외의 종류에 따라 다른 except 블록을 사용할 수 있습니다.
- else: 예외가 발생하지 않았을 때 실행할 코드 블록을 지정합니다. 선택적으로 사용할 수 있습니다.
- finally: 예외 발생 여부와 상관없이 항상 실행할 코드 블록을 지정합니다. 주로 리소스 정리 작업 등에 활용됩니다.
각각의 기법을 설명하고 예제 코드를 살펴보도록 하겠습니다.
위의 내용에 추가로 여러가지 처리기법도 다뤄보았습니다
try-except
가장 기본적인 예외 처리 기법으로, 예외가 발생할 수 있는 코드를 try 블록에 작성하고,
예외가 발생했을 때 처리할 코드를 except 블록에 작성합니다.
try:
x = 10 / 0 # ZeroDivisionError 발생
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
try-except-else
else 블록을 사용하여 예외가 발생하지 않았을 때 실행할 코드를 작성할 수 있습니다.
try:
x = 10 / 2
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
else:
print("나눗셈 결과:", x)
try-except-finally
finally 블록을 사용하여 예외 발생 여부와 관계없이 항상 실행할 코드를 작성할 수 있습니다.
주로 리소스를 정리하는 용도로 사용됩니다.
try:
f = open("example.txt", "r")
print(f.read())
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
finally:
f.close() # 파일 핸들 닫기
사용자 정의 예외 처리
사용자가 직접 예외 클래스를 정의하고 해당 예외가 발생했을 때 처리할 방법을 지정할 수 있습니다.
class CustomError(Exception):
def __init__(self, message):
self.message = message
try:
x = -1
if x < 0:
raise CustomError("음수는 허용되지 않습니다.")
except CustomError as e:
print("사용자 정의 예외 발생:", e.message)
다중 예외 처리
여러 종류의 예외를 하나의 except 블록에서 처리할 수 있습니다. 이 경우에는 각 예외를 튜플로 묶어서 지정합니다.
try:
x = int(input("나눌 숫자를 입력하세요: "))
result = 10 / x
except (ValueError, ZeroDivisionError):
print("올바른 숫자를 입력하세요. 0으로 나눌 수 없습니다.")
예외 객체 정보 출력
except 블록에서 예외 객체에 접근하여 예외에 관한 정보를 출력할 수 있습니다.
try:
x = 10 / 0
except ZeroDivisionError as e:
print("예외 발생:", e)
전역 예외 처리
try-except 블록을 전역 수준에서 사용하여 예외를 처리할 수 있습니다.
이는 모든 예외에 대해 일괄적으로 처리할 때 유용합니다.
try:
# 예외가 발생할 수 있는 코드
except Exception as e:
# 모든 예외 처리
print("예외 발생:", e)
중첩 예외 처리
try-except 블록을 중첩하여 여러 수준의 예외 처리를 구현할 수 있습니다.
try:
try:
x = 10 / 0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except Exception as e:
print("예외 발생:", e)
예외 다시 발생시키기
except 블록에서 예외를 다시 발생시킬 수 있습니다.
이를 통해 예외를 처리한 후에도 해당 예외를 호출자에게 전파할 수 있습니다.
try:
x = 10 / 0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
raise # 예외 다시 발생
AssertionError 처리
assert 문을 사용하여 특정 조건이 만족되지 않았을 때 AssertionError를 발생시킬 수 있습니다.
이를 예외 처리를 통해 처리할 수 있습니다.
try:
assert False, "이것은 AssertionError입니다."
except AssertionError as e:
print("AssertionError 발생:", e)
예외 처리 없이 사용하기
예외 처리가 필요 없는 경우도 있습니다. 이 경우 try-except 블록 없이 예외가 발생하는 코드를 직접 사용합니다.
result = 10 / 0 # 예외가 발생하면 프로그램이 비정상 종료됨
'Python > 기초 다지기' 카테고리의 다른 글
[파이썬 기초]내장 함수 사용법 (0) | 2024.02.20 |
---|---|
[파이썬 기초]패키지란?? (0) | 2024.02.19 |
[파이썬 기초]모듈이란?? (0) | 2024.02.18 |
[파이썬 기초]클래스란?? (0) | 2024.02.18 |
[파이썬 기초]파일 읽고 쓰기 (0) | 2024.02.18 |