exception

newhyork·2022년 6월 21일
0

exception handling


  • 로직을 따라 코드가 실행되는 중에 발생할 수 있는 각종 에러에 의해
    더 이상의 실행이 중단되는 등 프로세스가 비정상적으로 종료되지 않도록,
    에러에 대한 처리를 하는 것이다.
  • syntax error는 컴파일 과정에서 에러가 발생하는 것이므로,
    예외(runtime error)에 해당되지 않는다.

usage

try: 
- 에러가 발생할 가능성이 있는 코드를 작성한다.
  - 작성 시 의도한 대로 정상적으로 동작할 것으로 기대하지만, 
    에러가 발생할 것으로 염려되는 부분에 해당하는 코드이다.
- 단독으로는 사용할 수 없으며, 적어도 except 또는 finally와 함께 사용한다.

except [{error class name} [as {error object variable}]]: 
- try문에서 에러가 발생했을 때 실행할 코드를 작성한다.
- 에러마다 다르게 동작할 수 있도록, 여러 에러에 대해 작성할 수도 있다.
  - 서로 다른 에러에 대해 동일하게 동작하도록, 묶어서 처리할 수도 있다.
- pass를 두어, 단순히 에러를 무시할 목적으로 사용하기도 한다.
  - 이는 때에 따라 적절한 사용 방식이 아닐 수도 있다.
- 에러 객체를 print, 기본적으로 에러 메시지가 출력된다.
  - 이는, 해당 객체의 __str__() 메서드의 return 값 이다. 

else: 
- try문에서 에러가 발생하지 않고, 정상적으로 실행되었을 때 실행할 코드를 작성한다.

finally: 
- try문의 에러 발생 여부와 관계없이 실행할 코드를 작성한다.
- return문에 의해 함수가 종료되더라도 그 전에 이 구문을 실행하게 된다.
  - 반복문의 break 또한 마찬가지다. 
- 파일이나 DB와 관련하여 close를 할 목적으로 주로 사용한다.

raise error


  • 특정 에러를 일부러 일으키기 위해 사용한다.
  • 자식 클래스에서 메서드 오버라이딩하여 꼭 구현하도록 할 필요가 있는 메서드에 대해 부모 클래스에서 raise NotImplementedError를 두어, 구현하지 않고 호출했을 경우 등 각종 상황에 맞게 에러를 일으킬 필요가 있을 때 사용한다.
    (참고로 위 예시는, 추상 메서드에 해당한다.)

usage

raise {error class name}
- 클래스에 따라 Traceback의 에러 메시지를 커스텀하여 나타내고 싶다면,
  객체를 생성하는 방식으로 하여 인수에 해당 문자열을 작성해 넣으면 된다.

raise Exception('message')
...
except Exception as e:
    if str(e) == 'message': 
- 이런 식으로도 사용 가능하다. 
  (- 실제로, 경우에 따라선 이렇게 쓸 일이 있을 지 모르겠다.
    보통은 Exception class를 직접 만들어서 사용하곤 한다.)

make exception


  • 직접 에러 클래스를 만들 수도 있다.
    • Exception 클래스를 상속한다.
    • 에러 메시지를 사용하고자 한다면,
      __str__ 메서드에서 해당 문자열을 return 할 수 있게 작성한다.

usage

class MyError(Exception):
	def __str__(self):
    	return "error msg"


raise {error object}

0개의 댓글