[파이썬] try except으로 에러라인 출력하기
- Python/오류
- 2024. 8. 19.
try except 에러라인 출력하기
파이썬에서는 try except로 예외 오류 처리를 함으로써 프로그램이 정지되지 않고 무사히 끝내는 장치가 마련되어 있습니다. 에러를 넘기고 무사히 프로그램을 끝낼 수 있어서 너무 좋은데 프로그램 고도화를 위해서는 에러를 일으키거나 어떤 에러가 주로 나오는지 알고 있어야 합니다.
이번 포스팅에서는 try except를 이용해 에러를 일으키고 에러라인을 출력하는 방법에 대해 알아보도록 하겠습니다.
에러 일으키기
파이썬에서 try
와 except
블록을 사용할 때, except
블록에서 에러를 다시 발생시키려면 raise
를 사용할 수 있습니다. 이렇게 하면 현재 예외를 다시 던져서 상위 호출 스택으로 전달할 수 있습니다. 나눗셈시 0으로 무언가를 나누면 에러가 발생합니다. 이런 식으로 당연히 안 되는 에러를 일부러 발생시키는 것입니다. try except임에도 불구하고 raise를 이용해 에러를 일부러 일으킵니다.
try:
# 에러를 발생시킬 수 있는 코드
result = 10 / 0
except ZeroDivisionError as e:
print("ZeroDivisionError가 발생했습니다.")
# 에러를 다시 발생시킵니다
raise
새로운 에러로 발생시키기
만약 예외를 다시 발생시키지 않고 새로운 예외를 발생시키고 싶다면, raise
키워드 뒤에 새로운 예외를 지정할 수 있습니다:
try:
# 에러를 발생시킬 수 있는 코드
result = int("abc")
except ValueError as e:
print("ValueError가 발생했습니다.")
# 새로운 예외를 발생시킵니다
raise RuntimeError("새로운 RuntimeError 발생") from e
원래의 ValueError
예외는 RuntimeError
예외의 원인으로 첨부되어 발생하게 됩니다. from e
를 사용하면 원래 예외와 새로운 예외 사이의 연결을 유지할 수 있습니다.
모든 종류의 예외를 출력후 에러 발생시키기
모든 종류의 예외를 포착하고, 이를 출력한 후에 다시 발생시키고 싶다면, except
블록에서 Exception
을 사용하여 모든 예외를 잡을 수 있습니다. Exception
은 거의 모든 예외의 기본 클래스이기 때문에 대부분의 예외를 포착할 수 있습니다.
try:
# 에러를 발생시킬 수 있는 코드
result = 10 / 0 # 예를 들어, ZeroDivisionError
except Exception as e:
# 모든 예외를 잡아서 처리
print(f"예외가 발생했습니다: {e}")
# 예외를 다시 발생시킵니다
raise
try
블록 내에서 어떤 예외가 발생하더라도 except
블록이 실행됩니다. Exception
클래스는 모든 내장 예외 클래스의 기본 클래스이므로, 대부분의 예외를 처리할 수 있습니다.
모든 예외 처리할 때 주의사항
모든 예외를 포착하는 것은 디버깅과 문제 해결을 어렵게 할 수 있습니다. 예외를 처리할 때는 가능한 구체적인 예외를 포착하고, 적절한 예외 처리를 하는 것이 좋습니다.
Exception
을 사용하는 경우: 이 방법은 대부분의 예외를 처리할 수 있지만, SystemExit
, KeyboardInterrupt
와 같은 시스템 관련 예외는 Exception
으로 포착되지 않습니다. 이런 경우, BaseException
을 사용할 수 있지만, 일반적으로는 사용을 권장하지 않습니다. 왜냐하면 시스템 종료나 사용자 인터럽트와 같은 중요한 예외까지 잡을 수 있기 때문입니다. 일반적으로는 Exception
을 사용하는 것이 좋습니다.
try:
# 에러를 발생시킬 수 있는 코드
result = 10 / 0
except BaseException as e:
# 모든 예외를 잡아서 처리
print(f"예외가 발생했습니다: {e}")
# 예외를 다시 발생시킵니다
raise
Exception과 별반 다를게 없어보이지만 BaseException
을 사용하는 것은 보통 Exception
을 사용하는 것보다 위험할 수 있으니 정말 필요할 때가 아니면 쓰지 않는 걸 추천드립니다.
내장 예외 (Built-in Exceptions)
파이썬에 내장되어 있는 예외 목록입니다.
Exception
: 모든 내장 예외의 기본 클래스입니다.ArithmeticError
: 산술 연산 관련 예외의 기본 클래스입니다.ZeroDivisionError
: 0으로 나누려고 할 때 발생합니다.OverflowError
: 연산 결과가 숫자의 표현 범위를 초과할 때 발생합니다.FloatingPointError
: 부동 소수점 연산에서 오류가 발생할 때 발생합니다.
IndexError
: 시퀀스의 유효하지 않은 인덱스에 접근할 때 발생합니다.KeyError
: 딕셔너리에서 존재하지 않는 키를 접근할 때 발생합니다.TypeError
: 연산이나 함수 호출에서 타입이 일치하지 않을 때 발생합니다.ValueError
: 연산이나 함수 호출에서 잘못된 값을 전달할 때 발생합니다.UnpackValueError
: 패킹 해제 시 값의 개수가 맞지 않을 때 발생합니다.
AttributeError
: 객체에 없는 속성에 접근할 때 발생합니다.NameError
: 로컬 또는 글로벌 네임스페이스에서 존재하지 않는 이름을 참조할 때 발생합니다.UnboundLocalError
: 지역 변수가 참조되기 전에 할당되지 않았을 때 발생합니다.
ImportError
: 모듈을 찾을 수 없거나 모듈에서 이름을 찾을 수 없을 때 발생합니다.ModuleNotFoundError
: 모듈을 찾을 수 없을 때 발생합니다.
FileNotFoundError
: 파일을 찾을 수 없을 때 발생합니다.IOError
: I/O 연산에서 문제가 발생할 때 발생합니다.BlockingIOError
: 비차단 I/O 연산에서 문제가 발생할 때 발생합니다.ChildProcessError
: 자식 프로세스 관련 오류가 발생할 때 발생합니다.
OSError
: 운영 체제 관련 오류가 발생할 때 발생합니다.PermissionError
: 권한이 없을 때 발생합니다.FileExistsError
: 파일이 이미 존재할 때 발생합니다.
RuntimeError
: 프로그램 실행 중 발생하는 일반적인 오류입니다.RecursionError
: 재귀 호출이 너무 깊어졌을 때 발생합니다.
NotImplementedError
: 추상 메서드가 서브클래스에서 구현되지 않았을 때 발생합니다.SyntaxError
: 문법 오류가 있을 때 발생합니다.IndentationError
: 들여쓰기가 잘못되었을 때 발생합니다.TabError
: 탭과 공백이 혼합되어 있을 때 발생합니다.
EOFError
: 파일의 끝에 도달했을 때 발생합니다.StopIteration
: 반복이 끝났을 때 발생합니다 (주로 이터레이터에서).KeyboardInterrupt
: 사용자가 프로그램 실행을 중단할 때 발생합니다.BaseException
:Exception
의 기본 클래스입니다. 시스템 종료나 사용자 인터럽트 등의 특별한 예외를 처리할 때 사용합니다.
사용자 정의 예외 만들기
파이썬에서는 사용자 정의 예외를 만들 수 있으며, 이는 Exception
클래스를 상속받아 정의합니다. 사용자 정의 예외는 특정 상황에서 필요한 정보를 제공하거나 예외를 보다 구체적으로 처리할 때 유용합니다.
사용자 정의 예외를 만드는 방법은 다음과 같습니다:
class CustomError(Exception):
def __init__(self, message):
super().__init__(message)
self.message = message
try:
raise CustomError("이것은 사용자 정의 예외입니다.")
except CustomError as e:
print(f"발생한 예외: {e}")
이와 같은 예외 클래스는 자신의 프로그램 로직에 맞게 사용자 정의 예외를 만들고 처리하는 데 도움을 줍니다. 예외를 임의로 만들면 프로그램에서 발생하는 에러에 대해 컨트롤 할 수 있기에 굉장히 중요한 방법 중 하나입니다.
함께 보면 좋은 글
'Python > 오류' 카테고리의 다른 글
[판다스] csv불러올 때 DtypeWarning 해결방법 (0) | 2023.10.28 |
---|---|
Solving environment: failed with initial frozen solve. Retrying with flexible solve 해결 (0) | 2022.10.01 |
정규표현식 TypeError : expected string or bytes-like object (0) | 2022.02.14 |
Value Error If using all scalar values, you must pass an index 해결방법 (0) | 2022.01.08 |
파이썬 ClobberError 마구 뜰때 해결방법 (0) | 2021.11.24 |