( 참고 : “FastCampus, 데이터 엔지니어링 올인원” )

[ Data Engineering ]

Spotify Project - Error Handling


1. Error Handling

다양한 이유에서, 요청이 실패할 수 있다. (status code를 통해 해당 에러 원인 파악)

간단히 해결하고자 한다면, 단순히 try & except 구문으로 요청을 해보고 성공하면 그냥 그대로, 실패하면 에러가 뜨면 그 원인을 파악한 뒤 수정하면 된다.

try:
	r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)

except:
	logging.error(r.text)
	sys.exit(1)


하지만, 반환 받는 status code에 따라 우리는 해당 원인을 파악할 수 있고, 이를 코드로 구현하여 번거롭지 않게 보다 쉽게 자동화 할 수 있다.


status code가 200이 아니면 Error

  • 429 : 너무 많은 request! ( Rate Limiting을 초과한 것이다)
    • 해결 : Retry-After만큼의 초 만큼 대기를 해야 한다.
  • 401 : access token 만료
    • access token은 3600초 동안만 유효하다
    • 해결 : 따라서, 해당 에러가 뜨면 토큰을 재발급 받으면 된다.
r = requests.get("https://api.spotify.com/v1/search", params=params, 
                 headers=headers)

if r.status_code != 200:
    logging.error(r.text)

    if r.status_code == 429:

        retry_after = json.loads(r.headers)['Retry-After']
        time.sleep(int(retry_after))

        r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
        elif r.status_code == 401:

            headers = get_headers(client_id, client_secret)
            r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)

            else:
                sys.exit(1)


2. Code Summary

step 1) get_headers 함수를 통해, access token을 담은 header를 가져온 뒤

step 2) 해당 header를 사용해서 정보를 request한다. ( + 에러 핸들링 )

def main():
    headers = get_headers(client_id, client_secret)
    params = {
        "q": "BTS",
        "type": "artist",
        "limit": "5"
    }


    r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)
    if r.status_code != 200:
        logging.error(r.text)

        if r.status_code == 429:
            retry_after = json.loads(r.headers)['Retry-After']
            time.sleep(int(retry_after))
            r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)

        elif r.status_code == 401:
            headers = get_headers(client_id, client_secret)
            r = requests.get("https://api.spotify.com/v1/search", params=params, headers=headers)

        else:
            sys.exit(1)