레이블이 try 구문인 게시물을 표시합니다. 모든 게시물 표시
레이블이 try 구문인 게시물을 표시합니다. 모든 게시물 표시

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

==========

 

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