2021년 3월 23일 화요일

[파이썬] 런타임 오류 처리를 위한 try, except, else, finally 구문

 

프로그래밍 언어들로 코딩을 하다보면 문법이나 알고리즘상으로는 문제가 없이 실행이 잘 될것같아 보일 수 있습니다.

 

대부분의 경우, 문제는 발생되지는 않을 것입니다.

 

하지만 생각하지 못한 조건에서는 심각한 오류가 발생되고 이 오류로 인해 애써 코딩한 프로그램이 중단되거나, 잘못 동작될 수가 있습니다.

 

이런 오류가 발생했을 경우에 오류를 검출하고 이 오류의 위험성을 피하거나 최소화가 필요합니다.

 

파이썬에서는 이를 위해 “try”, “except”, “else”, “finally” 구문을 사용하여 오류 처리를 합니다. 일반적인 구문 형식은 아래와 같습니다.

 

try:

    ...

except [오류종류]:

    ...

else:

    ...

finally:

    ...

 

“try” 구문에서는 오류가 잠재된 일반적인 코드를 프로그래밍합니다.

 

“except” 구문에서는 오류가 발생시 실행될 코드를 넣습니다. “except” 구문에서는 처리할 오류의 종류를 지정할 수도 있습니다. 처리할 오류종류에 따라 “except” 구문을 추가할 수도 있습니다. 모든 “except” 구문에는 실행가능한 코드가 있어야 합니다.

 

오류가 발생시에는 “else” 구문에 있는 코드가 실행됩니다.

 

마지막으로 “finally” 구문에는 오류발생여부와 상관없이 실행될 코드를 넣습니다.

 

이들 구문들중에서 “try”를 뺀 “except”, “else”, “finally” 구문은 필요할때만 사용해도 됩니다.

 

아래의 예를 보면,

 

import requests

from bs4 import BeautifulSoup

 

# 잘못된 url로 페이지 내용 조회

url = "https://finance.naver.com/item/main.nhn?code=111"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    print (soup.dl.text)   # 이 부분에서 오류 발생

 

네이버 증권에서 잘못된 종목코드가 포함된 URL을 사용하면 주가정보 페이지를 프린트하는 코드에서 오류가 발생됩니다.

 

Traceback (most recent call last):

  File "err_handle1.py", line 11, in <module>

    print (soup.dl.text)

AttributeError: 'NoneType' object has no attribute 'text'

 

이를 처리하기 위해 아래와 같이 코드를 보완할 수 있습니다.

 

import requests

from bs4 import BeautifulSoup

 

url = "https://finance.naver.com/item/main.nhn?code=111"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    try:

        print (soup.dl.text)

    except:

        print ("에러 : 종목코드 오류")

 

그러면 아래와 같이 “except” 구문이 실행됩니다.

 

에러 : 종목코드 오류

 

“except” 구문에 아래와 같이 오류종류를 지정해도 되는데,

 

except AttributeError:

        print ("에러 : 종목코드 오류")

 

그러면 위와 같은 실행결과가 나오는 것을 볼 수 있습니다.

 

에러 : 종목코드 오류

 

이제 “else”“finally” 구문까지 모두 사용한 아래 코드를 보면,

 

import requests

from bs4 import BeautifulSoup

 

url = "https://finance.naver.com/item/main.nhn?code=005930"

 

response = requests.get (url)

 

if response.status_code == 200:

    html = response.text

    soup = BeautifulSoup (html, 'html.parser')

    try:

        print (soup.dl.text)

    except:

        print ("에러 : 종목코드 오류")

    else:

        print ("오류없음!!!")

    finally:

        print ("실행완료!!!")

 

“else” 구문은 오류가 없는 경우 실행되었고, “finally” 구문도 오류발생여부와 관계없이 실행됨을 알 수 있습니다.

 

종목 시세 정보

2021 03 23 15 57분 기준 장마감

종목명 삼성전자

종목코드 005930 코스피

현재가 81,800 전일대비 하락 200 마이너스 0.24 퍼센트

전일가 82,000

시가 82,600

고가 82,900

상한가 106,500

저가 81,800

하한가 57,400

거래량 13,181,031

거래대금 1,083,111백만

 

오류없음!!!

실행완료!!!

 

프로그래밍시에는 항상 발생할 수도 있는 오류종류를 미리 파악하는 것이 중요하며, 그에 맞는 오류처리도 중요합니다.

 

2021년 3월 22일 월요일

[파이썬] 주가정보을 조회하기 코드에서 주식종목 수정기능 및 런타임 오류처리 추가

 

이전에 포스팅한 주가정보 조회하기 코드에서 만약 주식종목코드가 잘못되었을 경우에는 오류가 발생할 수 있습니다.

 

오류가 발생하면 실행되던 코드가 오류를 디스플레이하면서 멈추게 되는데, 이러면 짜증이 날 듯 합니다.

 

그래서 오류가 발생시에 코드를 멈추지 않고 오류발생을 알려주면서 오류가 발생된 주식종목을 삭제하거나 수정할 수 있게 코드를 좀더 보완했습니다.

 

import requests

from bs4 import BeautifulSoup

 

stock_list = []   # 관심종목 목록

stock_item = ["", ""]   # 추가할 관심종목 입력

sel = ""

st_no = ""

st_name = ""   # 관심종목 이름 입력

st_code = ""   # 관심족옥 코드 입력

 

url = ""

url_temp = "https://finance.naver.com/item/main.nhn?code="

 

while True:

    print ("==========")

print ("96 : 관심종목 추가")   # 주식종목 추가

    print ("97 : 관심종목 수정")   # 주식종목 수정

    print ("98 : 관심종목 삭제")   # 주식종목 삭제

print ("99 : 종료")

    print ("종목코드 번호 : 선택한 종목 주가정보 조회")

    print ("==========")

 

    i = 0

    for i in range ( len(stock_list) ):

        print (i, " - ", stock_list[i][0], stock_list[i][1])

        i = i + 1

 

    print ("==========")

 

    sel = input ("원하는 항목을 입력하세요 : ")

    sel_no = int(sel)

 

    if sel == "96":   # 새로운 주식종목 추가

        st_name = input ("종목이름 : ")

        st_code = input ("종목코드 : ")

        stock_item[0] = st_name

        stock_item[1] = st_code

        stock_list.append(list(stock_item))

 

elif sel == "97":

        st_no = input ("종목항목번호 : ")

        st_name = input ("종목이름 : ")

        st_code = input ("종목코드 : ")

        stock_item[0] = st_name

        stock_item[1] = st_code

        stock_list.copy(list(stock_item))   # 수정한 종목코드를 목록에 복사

 

    elif sel == "98":   # 지정된 주식종목 삭제

        st_no = input ("종목항목번호 : ")

        del stock_list[ int(st_no) ]

 

    elif sel == "99":   # 종료

        break

 

    else:   # 선택한 주식종목 주가정보 보여주기

        url = url_temp + stock_list[sel_no][1]

 

        response = requests.get (url)

 

        if response.status_code == 200:

            html = response.text

            soup = BeautifulSoup (html, 'html.parser')

print ("----------")

 

            try:   # 오류발생을 처리

                print (soup.dl.text)

            except:

                print ("주식종목코드 오류")

 

            print ("----------")

 

아래와 같이 삼성전자를 예를 들어 보면 종목코드를 잘못 입력했습니다.

 

원하는 항목을 입력하세요 : 96

종목이름 : samsung

종목코드 : 111

==========

96 : 관심종목 추가

97 : 관심종목 수정

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

 

만약 삼성전자 주가정보를 조회하면 에러가 발생됩니다 (AttributeError).

 

런타임 에러가 발생되면 바로 에러표시를 하면서 코드가 멈추게 되는데, 오류처리를 하여 발생한 오류표시를 하고 계속 코드는 동작합니다.

 

원하는 항목을 입력하세요 : 0

----------

주식종목코드 오류

----------

==========

 

그러면 삼성전자 종목코드를 수정하면 아래와 같이 수정됨을 알 수 있습니다.

 

원하는 항목을 입력하세요 : 97

종목항목번호 : 0

종목이름 : 삼성전자

종목코드 : 005930

==========

96 : 관심종목 추가

97 : 관심종목 수정

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

0  -  삼성전자 005930

==========

 

이제 런타임 오류도 문제없이 처리하고 잘못된 종목코드도 수정할 수 있게 되었습니다.

 

2021년 3월 19일 금요일

[파이썬] 관심주식종목 목록에 종목 추가/삭제가능 및 선택한 주가정보을 조회하기 (네이버 증권 사이트 이용)

 

이번에는 파이썬을 이용하여 특정 주식종목 목록을 입력할 수 있고 또 목록에서 주식종목 삭제도 할 수 있게 새롭게 코드를 작성했습니다.

 

지난번에는 일일이 주식종목 코드를 코드상에 직접 입력하다보니 새로운 주식종목을 조회하기 위해서는 엄청 불편합니다.

 

import requests

from bs4 import BeautifulSoup

 

stock_list = []   # 관심종목 목록

stock_item = ["", ""]   # 추가할 관심종목 입력

sel = ""

st_no = ""

st_name = ""   # 관심종목 이름 입력

st_code = ""   # 관심족옥 코드 입력

 

url = ""

url_temp = "https://finance.naver.com/item/main.nhn?code="

 

while True:

    print ("==========")

    print ("97 : 관심종목 추가")

    print ("98 : 관심종목 삭제")

    print ("99 : 종료")

    print ("종목코드 번호 : 선택한 종목 주가정보 조회")

    print ("==========")

 

    i = 0

    for i in range ( len(stock_list) ):

        print (i, " - ", stock_list[i][0], stock_list[i][1])

        i = i + 1

 

    print ("==========")

 

    sel = input ("원하는 항목을 입력하세요 : ")

    sel_no = int(sel)

 

    if sel == "97":   # 새로운 주식종목 추가

        st_name = input ("종목이름 : ")

        st_code = input ("종목코드 : ")

        stock_item[0] = st_name

        stock_item[1] = st_code

        stock_list.append(list(stock_item))

 

    elif sel == "98":   # 지정된 주식종목 삭제

        st_no = input ("종목항목번호 : ")

        del stock_list[ int(st_no) ]

 

    elif sel == "99":   # 종료

        break

 

    else:   # 선택한 주식종목 주가정보 보여주기

        url = url_temp + stock_list[sel_no][1]

 

        response = requests.get (url)

 

        if response.status_code == 200:

            html = response.text

            soup = BeautifulSoup (html, 'html.parser')

            print ("----------")

            print (soup.dl.text)

            print ("----------")

 

여기에 작성한 코드는 파이썬에서 기본적인 키워드를 주로 사용하여 작성하였으므로 보기에 어렵지 않을 것입니다.

 

처음 실행하면 등록된 관심종목이 없으므로 아래와 같이 나올 것입니다.

 

==========

98 : 관심종목 추가

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

==========

원하는 항목을 입력하세요 :

 

여기서 종목추가를 위해 “97”을 입력하고, 추가할 종목이름과 코드를 입력합니다.

 

그러면 아래와 같이 화면이 나오는데, 예제로 네이버를 입력해보았습니다.

 

원하는 항목을 입력하세요 : 97

종목이름 : 네이버

종목코드 : 035420

==========

97 : 관심종목 추가

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

0  -  네이버 035420

==========

 

다시 추가로 삼성전자현대차를 입력해보겠습니다.

 

==========

0  -  네이버 035420

1  -  삼성전자 005930

2  -  현대차 005380

==========

 

여기에서 삼성전자를 삭제하면 아래 그림과 같이 나옵니다.

 

원하는 항목을 입력하세요 : 98

종목항목번호 : 1

==========

97 : 관심종목 추가

98 : 관심종목 삭제

99 : 종료

종목코드 번호 : 선택한 종목 주가정보 조회

==========

0  -  네이버 035420

1  -  현대차 005380

==========

 

어디서든 해당 종목에 대한 목록번호를 입력하면 해당 종목의 주가정보를 볼 수 있습니다.