1 분 소요

개요

파이썬 코드 컴파일 시 발생할 수 있는 오류에는 구문 오류(syntax error, 구문 분석(parsing) 오류))와 실행 중 발견되는 예외(exception)가 존재한다. 구문 오류 발생 시 컴파일 자체가 안되지만 예외는 실행 중에 발견할 수 있다.

예외 처리

예외가 발생했는데 코드 내에서 (try-except 문으로) 처리하지 않는다면 파이썬은 예외 메시지와 함께 트레이스백(traceback, 역추적)을 출력한다. 트레이스백은 처리되지 않은 예외가 발생한 지점에서 호출 스택 맨 위까지 수행된 모든 호출 목록을 포함한다.

예외를 처리하려면 try-except문을 사용하면 된다. 자세한 내용은 try-except문으로 예외 처리 문서 참고.

예외 처리에 관한 구글 파이썬 스타일 가이드

구글 파이썬 스타일 가이드에서는 예외 처리 시 다음의 사항들을 지키도록 권고하고 있다.

  • ValueError 등 상황에 따라 적절한 내장 예외 클래스를 사용한다.
  • 공개 API의 인자값을 검증하려는 목적으로 assert문을 사용하지 말 것. 즉, assert문은 정확한 사용을 강요하거나 예기지 못한 상황이 발생했음을 알리는 목적이 아니라 내부적 정확성을 보장하기 위한 용도로 사용된다. 예기치 못한 상황 발생에 대한 처리는 raise문을 사용한다. → “반드시 이렇게 하도록 지키세요!”처럼 강요하는 목적이 아니라, 해당 코드가 원하는 목적대로 정확하게 작업을 수행한다는 것을 보장하기 위한 용도이다.
  • 라이브러리나 패키지에서 자체적으로 자신들만의 예외를 정의할 수 있다. 이때는 내장 예외 클래스를 상속하여 만들어야 한다. 예외 이름은 Error로 끝나야 하며, foo.FooError와 같이 이름을 반복해서 쓰면 안된다.
  • 예외를 다시 일으키려는 것이거나(re-raise) 예외가 명시적으로 나타나지 않고 숨겨져서 이를 파악하기 위한 용도가 아니라면 모든 예외를 처리하는(catch-all) except 문이나 Exception, StandardError는 사용하지 않도록 한다. 파이썬은 예외에 대해 엄격하지 않아서 except문은 정말로 모든 예외를 처리하려고 할 수 있다. 이러면 원치 않는 예외 처리까지 진행될 수 있다. 즉, 앞서 언급한 특정 상황을 제외하면 Exception이라는 포괄적인 예외 클래스 대신 IndexError처럼 특정 상황에서만 발생할 수 있는 예외 클래스를 명시함으로써 구체적인 예외를 언급하라는 뜻이다.
  • try-except문 안에 작성할 코드를 최소화한다. 만약 코드가 길면 예상하지 못한 예외까지 포착되어 좀 더 본질적인 예외를 처리하기가 힘들어진다.
  • try 블록 내의 코드 실행 시 예외가 발생하든 그렇지 않든 이후 무조건 실행하고자 하는 코드가 있으면 finally 구문 안에서 작성하면 된다. 이 구문은 파일 닫기 등 자원 정리(cleanup)에 유용하게 쓰일 수 있다.

Reference

[1] 지은이: 미아 스타인, 옮긴이: 최길우, “파이썬 자료구조와 알고리즘”, (2019, 한빛미디어)

This content is licensed under CC BY-NC 4.0

댓글남기기