프로그래밍을 하다 보면 예상치 못한 오류가 발생하기 마련이다. 예를 들어 사용자가 잘못된 값을 입력하거나, 존재하지 않는 파일을 열려고 하는 경우, 또는 서버 응답이 늦어지는 상황 등 다양한 오류가 생긴다. 이런 문제를 안전하게 처리하지 않으면 프로그램은 강제로 종료되고, 사용자 경험이 나빠진다.
이때 필요한 것이 바로 예외 처리(Exception Handling) 이다. 파이썬은 try, except, else, finally 구문을 통해 오류를 유연하게 다룰 수 있도록 설계되어 있다.
예외(Exception)란 무엇인가
예외란 프로그램 실행 중에 발생하는 오류를 의미한다. 단순한 문법 오류와는 다르며, 코드 실행 도중에 발생하는 상황을 말한다. 예를 들어 숫자 0으로 나누기를 시도하거나, 존재하지 않는 파일을 열면 예외가 발생한다.
이런 예외를 처리하지 않으면 프로그램은 즉시 종료되지만, 예외 처리를 통해 오류 상황에서도 안정적으로 동작을 유지할 수 있다.
try-except의 기본 구조
예외 처리의 기본 형태는 다음과 같다.
try 블록에는 오류가 발생할 수 있는 코드를 넣고, except 블록에는 오류가 발생했을 때 실행할 코드를 작성한다.
예를 들어 사용자의 입력을 숫자로 변환하는 코드를 생각해보자.
입력값이 숫자일 경우에는 정상적으로 실행되지만, 문자를 입력하면 ValueError가 발생한다. 이때 프로그램이 멈추지 않도록 except를 통해 예외를 처리할 수 있다.
예시 상황 설명
try: 위험할 수 있는 코드를 실행한다.
except: 오류가 발생하면 여기서 처리한다.
이렇게 작성하면 프로그램이 갑자기 종료되는 것을 방지하고, 사용자에게 친절한 메시지를 보여줄 수 있다.
다양한 예외 유형 처리하기
파이썬은 다양한 내장 예외 클래스를 제공한다. 대표적인 예시는 다음과 같다.
ValueError: 잘못된 값을 입력했을 때 발생
ZeroDivisionError: 0으로 나눴을 때 발생
FileNotFoundError: 존재하지 않는 파일을 열었을 때 발생
TypeError: 자료형이 맞지 않을 때 발생
예를 들어 파일을 열 때 FileNotFoundError가 발생할 수 있다. 이때 try-except로 감싸면 프로그램이 멈추지 않고 오류를 우회할 수 있다.
또한 except 뒤에 예외 이름을 명시하면, 특정 오류만 골라서 처리할 수도 있다.
else와 finally의 역할
try-except 구문에는 else와 finally를 추가로 사용할 수 있다.
else는 예외가 발생하지 않았을 때 실행되는 코드를, finally는 예외 발생 여부와 관계없이 항상 실행되는 코드를 의미한다.
예를 들어 파일을 여는 코드에서 finally를 사용하면, 오류가 나더라도 파일을 반드시 닫을 수 있다.
이 방식은 시스템 자원을 안전하게 관리하기 위해 매우 중요하다.
흐름 요약
try: 오류가 날 수도 있는 코드 실행
except: 오류가 발생하면 처리
else: 오류가 없을 때만 실행
finally: 항상 실행
이 구조를 이해하면 프로그램이 훨씬 안정적으로 동작하게 된다.
사용자 정의 예외 만들기
기본 예외만으로는 처리하기 어려운 상황이 있을 수 있다. 예를 들어 특정 조건이 만족되지 않을 때 사용자에게 직접 정의한 예외를 발생시키고 싶을 때가 있다.
이럴 때는 Exception 클래스를 상속받아 새로운 예외 클래스를 만들 수 있다.
사용자 정의 예외의 구조는 간단하다.
class CustomError(Exception):
pass
이렇게 정의한 후, raise 문으로 직접 예외를 발생시킬 수 있다.
예를 들어 로그인 시스템에서 비밀번호가 틀렸을 때 CustomError를 발생시키면, 일반적인 ValueError 대신 더 구체적인 예외 메시지를 제공할 수 있다.
이런 방식은 대규모 시스템에서 특히 유용하다. 코드의 가독성이 높아지고, 오류를 세분화해 관리할 수 있기 때문이다.
예외 처리의 실무 활용
예외 처리는 단순히 오류를 잡는 용도에 그치지 않는다. 실무에서는 로그를 남기거나, 오류 유형에 따라 다른 대응을 하도록 구조화한다.
예를 들어 서버에서 파일을 처리하는 프로그램이라면, 예외가 발생할 때 오류 메시지를 로그 파일에 저장하고, 이후 관리자에게 알림을 보내는 식으로 연계할 수 있다.
또한, 너무 많은 예외를 한꺼번에 처리하는 것은 좋지 않다. except Exception: 과 같은 포괄적 처리보다는, 발생 가능한 오류를 구체적으로 명시하는 것이 좋다. 이렇게 하면 디버깅이 쉬워지고, 코드가 의도한 대로 동작하는지 더 명확하게 관리할 수 있다.
정리
예외 처리는 안정적인 프로그램을 만드는 핵심 기술이다.
try-except 구문을 사용하면 프로그램이 중단되지 않고 계속 동작할 수 있으며, else와 finally를 통해 세밀한 제어도 가능하다.
또한 사용자 정의 예외를 활용하면 코드의 구조를 명확히 하고 유지보수성을 높일 수 있다.
정리하자면 다음과 같다.
예외는 프로그램 실행 중 발생하는 오류이다.
try-except로 예외를 잡을 수 있다.
else와 finally로 흐름을 정교하게 제어할 수 있다.
사용자 정의 예외로 코드를 체계적으로 관리할 수 있다.
마무리
예외 처리는 초보 개발자들이 자주 놓치는 부분이지만, 실제로는 프로그램의 안정성과 신뢰성을 좌우하는 중요한 기술이다.
사용자의 예상치 못한 입력, 네트워크 오류, 파일 입출력 문제 등 현실적인 상황에서 프로그램이 끊기지 않게 하려면 반드시 예외 처리 개념을 익혀야 한다.
이 글은 파이썬 예외 처리의 구조와 원리를 이해하기 쉽게 정리한 심화 과정 포스팅으로, 애드센스 교육형 콘텐츠로도 충분히 적합하다.