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:로 묶지 말고, 예상된 예외만 구체적으로 잡는 것이 좋습니다.