본문 바로가기
파이썬/주식 자동매매

Python 키움API 자동매매프로그램 개발-28.Python 기초편 예외처리(1)

by 행복론자 2021. 2. 7.

시리즈 이전글입니다.

2021/02/05 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-27.Python 기초편 모듈(2) as, package

 

 

프로그램이 동작하다 에러가 발생한 상황을 예외(exception)라고 합니다.

예를 들어 0으로 정수를 나누려고 하는 것은 불가하므로 다음 코드를 실행시키면 에러(예외)가 발생합니다.

var = 10 / 0

# ZeroDivisionError: division by zero

 

 

프로그래밍을 하다보면 에러는 항상 따라다니지만 문제는 예외가 발생하면 프로그램이 비정상적으로 종료되어버린다는 것입니다. 

갑자기 의도치 않은 순간에서 비정상적인 종료가 일어난다는 것은 시스템 운영에 큰 걸림돌이 됩니다. 예를 들어 트레이딩 시스템을 동작시키는데 갑자기 예외가 발생해 매도해야할 종목을 매도하지 못한다면 이는 금전적인 손해로 직결될 수 있습니다.

 

따라서 예외가 발생할 경우 프로그램 전체를 종료시키지 않고 적절한 처리를 하는 방법이 필요하며 이를 예외처리(try-except)라고 합니다.

그러면 예외처리 사용 방법에 대해 알아보겠습니다.

try:
  실행할 코드  # 예외가 발생할 수도 있는 영역
except Exception:
  예외발생시 처리코드  # 예외가 발생시 처리할 부분

 

 

try라는 키워드 밑에 등장하는 영역에는 실행할 코드들이 나오며 

except 키워드 밑에는 try블록 코드를 실행하다가 예외가 발생할 경우 처리하는 부분입니다.

 

except 다음에 오는 Exception이란 Python내 정의된 예외입니다. 

Python 내에는 다양한 내장 예외가 존재하며 Python 공식문서인 이 글에서 확인할 수 있습니다. 

다양한 예외가 발생할 경우로 세분화해서 예외마다 적절한 처리를 할 수도 있습니다. 

예를 들면 이렇습니다.

try:
  var = 10 / 0
except ZeroDivisionError:  # 0을 이용해 나누려고 할 때 발생하는 예외
  print("0으로 나눌 수 없습니다.")
except MemoryError:  # 메모리 문제로 발생하는 예외
  print("메모리 에러입니다")

 

 

try에 등장하는 코드 블럭은 조건문, 반복문처럼 들여쓰기가 되어있어야 한다는 점을 기억해주시기 바랍니다. 

이후 except를 이용해 예외상황에 맞는 처리를 할 수 있습니다.

try는 중복해서 사용할 수 없지만 try 다음에 등장하는 except는 예외별로 구분해서 중복해 사용할 수 있습니다. 

첫번째로 등장하는 ZeroDivisionError라는 예외는 숫자를 0을 이용해 나누려고 할 때 발생하고 그 다음으로 MemoryError는 메모리 문제가 생겼을 때 발생하는 예외입니다.

 

우리가 try 구문 안에서 실행하는 것은 정수 10을 0으로 나누려고 한 것이므로 ZeroDivisionError 예외가 발생하고 except ZeroDivisionError에서 예외를 처리하게 됩니다. 

따라서 프로그램을 실행해보면 발생한 예외가 except ZeroDivisionError에서 처리되어 다음 결과가 출력됩니다.

0으로 나눌 수 없습니다.

 

 

하지만 만약 다음처럼 try 구문 안에서 발생하는 해당 예외에 대한 except 처리가 없다면 

except 구문이 있더라도 적절한 예외처리가 되지 않아 프로그램이 비정상 종료됩니다.

try:
  var = 10 / 0
except MemoryError:  # 메모리 문제로 발생하는 예외
  print("메모리 에러입니다")

# ZeroDivisionError: division by zero

 

 

이렇게 try 안에서 발생할 수 있는 예외에 대해 정확히 알지 못한다면 try-except 구문을 사용하는 것이 무의미할 수 있습니다. 하지만 그렇다고 모든 예외처리를 할 수도 없는 노릇입니다.

 

이럴 경우 모든 예외를 커버할 수 있는 Exception 사용이 필요합니다. 

 except Exception을 사용한다면 어떠한 예외도 처리할 수 있습니다.

try:
  var = 10 / 0
except Exception:
  print("예외가 발생했습니다.")

 

 

코드를 동작시키면 except Exception에서 예외를 처리해 “예외가 발생했습니다.”가 출력되는 것을 알 수 있습니다. Exception에서 모든 예외를 처리할 수 있는 이유는 예외들도 계층구조를 이루고 있는 객체이기 때문입니다. 여기서 Exception이 다른 예외들의 부모의 해당하므로 모든 예외를 대신 처리할 수 있었던 것입니다.

 

Exception을 이용하면 모든 예외를 처리할 수 있는 장점이 있지만 정확히 무슨 예외가 발생했는지 파악하기 어렵습니다. 이럴 경우 다음처럼 처리하면 예외 내용을 알 수 있습니다. 

try:
  코드
except Exception as 변수:
  print(변수)

 

 

발생 예외를 as를 이용해 변수로 지정합니다. 이후 해당 변수를 출력하면 에러 내용을 알 수 있습니다. 그러면 Exception을 e라는 변수로 명명해 출력해보겠습니다.

try:
  var = 10 / 0
except Exception as e:
  print("예외가 발생했습니다.")
  print(e)

# 예외가 발생했습니다.
# division by zero

 

 

출력해보면 발생한 예외가 divsion by zero라는 것을 확인할 수 있습니다.

 

 


같이 보시면 좋을 글

2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

 

주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

주식매매프로그램 개발 노하우에 관한 제 전자책이 발간되었습니다. https://kmong.com/gig/292764 주식매매프로그램, 쉽게 따라 만드는 노하우와 소스를 드립니다. | 36000원부터 시작 가능한 총 평 0개

jsp-dev.tistory.com

 

 

2021/02/10 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-29.Python 기초편 예외처리(2) else, finally

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글