반응형

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

 

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

 

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

 

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

 

파이썬에서는 이를 위해 “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백만
 
오류없음!!!
실행완료!!!

 

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

반응형
Posted by HLIFEINFO
,