Summary

  • pass는 빈칸 채우기, continue는 현재 회차 건너뛰기, break는 반복문 탈출이다
  • try-except-else-finally로 에러를 처리하며, finally는 자원 해제를 무조건 실행한다
  • raise는 비즈니스 로직 위반을 강제로 알리고, assert는 개발자 로직(버그)을 검증한다

흐름 제어

반복문을 제어하는 세 키워드는 영향 범위가 다르다.

키워드의미영향 범위
pass빈칸 채우기흐름에 영향 없음(아래 코드 실행 O)
continue건너뛰기현재 회차 중단(아래 코드 실행 X)
break탈출하기반복문 전체 종료

pass — 구조 유지 플레이스홀더

pass는 문법 오류를 피하기 위한 빈칸으로, 기능적으로 아무것도 하지 않는다. 파이썬은 들여쓰기로 블록을 구분하기 때문에, if나 함수 정의 아래에 아무 코드도 없으면 IndentationError가 난다. 이때 “아무것도 안 하지만 문법 오류는 내지 마”라고 알리는 것이 pass다.

# 스켈레톤 코드
class DataPipeline:
    def extract(self):
        pass   # TODO: 추후 구현
 
# 예외 무시
try:
    os.remove("temp_file.txt")
except FileNotFoundError:
    pass   # 파일이 없으면 그냥 둠

continue — 결측치/오류 스킵

현재 아이템 처리를 중단하고 다음 회차로 넘어간다. 잘못된 로그나 결측 데이터를 건너뛸 때 쓴다.

raw_logs = ["INFO: User logged in", "", "ERROR: Connection failed"]
 
for log in raw_logs:
    if not log.strip():   # 빈 줄이면
        continue          # 다음 로그로
 
    print(f"Parsing: {log}")

break — 조기 종료

반복문 자체를 완전히 종료한다. 원하는 데이터를 찾았거나 폴링 중 성공 응답을 받았을 때 쓴다.

for i in range(max_retries):
    if check_server_status() == 200:
        print(f"서버 준비 완료 (시도: {i+1})")
        break
    time.sleep(1)
else:
    # break 없이 루프가 끝까지 돌면 실행 (Python 고유 문법)
    print("서버 연결 시간 초과")

예외 처리

try-except-else-finally

단순히 에러를 잡는 것을 넘어 자원 누수를 방지하는 패턴이다.

  • try: 에러 발생 가능성이 있는 로직
  • except: 에러 발생 시 대응(로깅, 롤백)
  • else: 에러 없이 성공했을 때만 실행
  • finally: 무조건 실행(DB 연결 종료, 파일 닫기)
db_connection = None
 
try:
    db_connection = connect_to_database()
    data = db_connection.query("SELECT * FROM users")
 
except ConnectionError as e:
    print(f"DB 연결 에러: {e}")
 
else:
    print(f"데이터 조회 완료: {len(data)}건")
 
finally:
    if db_connection:
        db_connection.close()
        print("DB 연결 해제됨")

능동적 에러 제어

raise — 비즈니스 로직 강제

문법적으로는 맞지만 로직상 허용하면 안 되는 값이 들어왔을 때, 개발자가 직접 에러를 발생시킨다.

def calculate_metrics(df):
    if 'price' not in df.columns:
        raise ValueError("필수 컬럼 누락: 'price' 컬럼이 없습니다.")
    return df['price'].mean()

assert — 단언 및 디버깅

“이 시점에는 데이터가 무조건 이 상태여야 한다”고 선언한다. 데이터의 형태나 분포가 예상과 맞는지 검증할 때 쓴다.

assert len(train) + len(test) == total_count, "데이터 누실 발생!"

if 대신 assert를 쓰는 이유

구분if + raiseassert
대상사용자 입력, 외부 환경(파일/네트워크)개발자 로직 검증(내부 버그)
배포 시실행됨(필수 로직)삭제 가능(-O 옵션 사용 시)
의미”에러가 나면 처리해줘""이게 틀리면 내 코드는 버그야”

assert는 실행 시 최적화 옵션(-O)을 주면 컴파일 과정에서 삭제된다. 개발 단계에서는 꼼꼼히 검사하고 배포 시에는 성능 저하 없이 실행할 수 있다.

보안 로직에 assert 금지

assert는 배포 시 삭제될 수 있으므로, 비밀번호 확인이나 권한 체크 같은 보안 로직에는 절대 쓰면 안 된다.


Reference