https://docs.python.org/3/tutorial/errors.html#handling-exceptions

  • 예외는 try 내부에서 호출된 함수들 안에서 발생해도 해당 try의 except에서 잡힙니다.
  • 여러 예외를 하나의 except (A, B, …)로 묶을 수 있습니다.
  • 예외 클래스는 상속 관계를 따릅니다(파생 클래스→ 기반 클래스 순으로 배치해야 의도대로 매칭).
  • except SomeError as err로 예외 인스턴스를 변수에 받아 err.args나 str(err)로 상세 메시지를 확인할 수있습니다.
  • 일반 패턴:
    • 예상 가능한 오류는 구체적으로 잡아서 메시지 처리 (OSError, ValueError 등).
    • 정말 알 수 없는 오류는 로그 후 다시 raise 해서 상위로 전파.
  • else 절: try에서 예외가 없을 때만 실행할 코드에 사용(예: 파일 열기 성공 후 처리). 예외를 불필요하게 삼키는 일을 줄여줍니다.
  • finally는 생략됐지만, 정리 작업(파일 닫기, 잠금 해제 등)을 항상 실행할 때 사용합니다.

사용예시

try:
  int("abc")
except ValueError as err:
  print(err.args)   # ('invalid literal for int() with base 10: \'abc\'',)
  print(str(err))   # invalid literal for int() with base 10: 'abc'
try:
  raise Exception("spam", "eggs")
except Exception as err:
  print(err.args)    # ('spam', 'eggs')
  print(str(err))    # ('spam', 'eggs')  -> Exception은 args를 그대로 보여줌
  a, b = err.args
  print(a, b)        # spam eggs

커스텀 예외에서 메시지 제어하기

class MyError(Exception):
  def __init__(self, code, msg):
	  super().__init__(code, msg)
	  self.code = code
	  self.msg = msg
  def __str__(self):
	  return f"[{self.code}] {self.msg}"
	  
	  
try:
  raise MyError(404, "not found")
except MyError as err:
  print(err.args)  # (404, 'not found')
  print(str(err))  # [404] not found
  print(err.code)  # 404
 
  • 로깅 시 logging.exception(“context”)를 쓰면 현재 예외 정보를 자동으로 포함합니다(try/except 내부에서 호출).
  • 너무 광범위하게 except Exception as err:로 묶지 말고, 예상된 예외만 구체적으로 잡는 것이 좋습니다.

← python 3.14으로