HAEJUN RECORDS

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

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

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

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

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

assert

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

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

if 대신 assert를 쓰는 이유

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

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

보안 로직에 assert 금지

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


Reference