IF vs TRY-EXCEPT (LBYL vs EAFP)

이지·2025년 3월 27일

matchpoint_refactoring

목록 보기
1/2

로직을 처리할 때, if문이 더 효율적일지 try-except문이 더 효율적일지 궁금해져서 찾아보았다.

if문

  • 사전 검사(look before you leap, LBYL) 방식으로 사용
  • 코드 실행 전, 조건을 확인하여 예외가 발생하지 않도록 함

장점
1. 코드 흐름 예측 가능
2. 예외 발생을 미리 방지하여 불필요한 예외 처리를 줄임
3. 예외 발생 시 성능 저하 없음(실행 비용이 낮음)
4. 조건 처리에 적합

단점
1. 경쟁 조건(Race Condition) 발생 가능

사용하는 경우

  • 성능이 중요한 경우
  • 코드 가독성이 중요한 경우
  • 예외 발생이 흔한 경우
  • T/F로 조건이 나오는 경우
  • user의 Input에 따라 다른 action이 필요한 경우

경쟁 조건?
두 개 이상의 프로세스가 공유자원에 동시에 접근할 때 발생하는 오류. 경쟁 조건이 발생하면 스레드의 처리 순서에 따라 결과가 바뀔 수 있다. 동기화 매커니즘(Lock 등)을 이용해 해결가능.

try-except

  • 먼저 실행하고 exception을 핸들링
  • 문제가 발생하면 예외를 처리(Easier to Ask for Forgiveness than Permission, EAFP)
  • 구체적인 에러 핸들링 가능

장점
1. 여러 종류의 예외를 처리하기 쉬움

단점
1. 예외 발생시 스택 트레이스를 생성해야 하므로 성능 오버헤드 발생 가능성 (잦은 예외 발생시 성능 저하)
2. 코드가 try-except 블록에 감싸여 있어 가독성이 떨어질 수 있음

사용하는 경우

  • 경쟁 조건의 가능성이 있는 경우
  • 예외 발생이 드문 경우

스택 트레이스?
예외가 발생한 지점부터 호출 스택의 모든 함수 호출 정보. 이를 통해 코드에서 발생한 오류를 추적하고 디버깅 할 수 있음.
traceback.print_exc() : 가장 최근에 발생한 예외에 대한 전체 스택 트레이스 출력

어떤게 더 빠를까?

예외가 발생하지 않는다면 try-except이 더 빠르다. if의 경우 조건들을 모두 확인해야하기 때문이다. 하지만 try 내부에서 예외가 발생하면, 스택 트레이스를 생성하고 예외 처리를 위한 컨텍스트르 관리해야한다. 예외가 자주 발생하면 try-except가 훨씬 느리다. 예외가 정말 예외적이라면 try-except를, 정상적인 흐름에서 발생하는 예외라면 if를 쓰는 것이 좋다.

profile
이지하게 살자

0개의 댓글