반응형
출처 : https://stackoverflow.com/questions/40286841/what-is-the-best-way-to-raise-request-errors
저는 다음 방법으로 나쁜 요청(requests)에 대해 오류를 발생하는 소스 코드를 읽고 있습니다.
import requests
response = requests.get("www.google.com") # http:// 가 없기 때문에 작동하지 않습니다.
if response.ok is False or response.json()['status'] != 'success':
raise Exception("API error: {}".format(response.json()['message']))
저는 마지막 2줄을 다음 구문으로 대체해야겠다고 생각하였습니다.
response.raise_for_status()
오류가 리턴한 내용에서 차이점을 발견하지 못했습니다. 2가지 모두 다음과 같이 나왔습니다.
Traceback (most recent call last):
File "/home/kurt/Documents/Scratch/requests_test.py", line 3, in <module>
response = requests.get("www.google.com") # This won't work because it's missing the http://
File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 451, in request
prep = self.prepare_request(req)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 382, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 304, in prepare
self.prepare_url(url, params)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 362, in prepare_url
to_native_string(url, 'utf8')))
requests.exceptions.MissingSchema: Invalid URL 'www.google.com': No schema supplied. Perhaps you meant http://www.google.com?
raise_for_status()
는 더 간결하고 아마도 원래 예외에 대한 정보를 잃지 않는 것 같습니다 (참조. "except Exception"대 파이썬에서 "except ... raise" 사용). 이것이 실제로 더 나은 접근법일까요?
1개의 답변
response.raise_for_status()
는 응답의 상태 코드가 200이 아닌 응답일 때만 예외(Exception)를 발생합니다. 두 번째 경우인 response.json()['status'] != 'success'
가 만족할 경우, 커버하지 않습니다.
하지만 다른 오류가 있습니다. requests.get()
호출에 의해 예외가 발생하므로 if
테스트에 도달하지 않습니다. 스키마를 전달하지 못했습니다 (문자열 앞에 http://
또는 https://
없음). requests.get() 표현식에서 예외가 발생하므로 다음 행은 절대로 실행되지 않습니다. 요청도 전송되지 않으므로 응답에 대한 assertion도 만들 수 없습니다.
테스트는 더 많은 문제가 있습니다.
requests.ok is False
관용적인 파이썬 표현이 아닙니다. 대신에not requests.ok
를 사용하는 것이 좋습니다.- 만약
requests.ok is False
를 만족하면,requests.json()
은 대부분 실패할 것입니다. 그래서response.json()['message']
를 사용한 다음 줄은 다른 오류를 발생할 것입니다.
반응형
'Python' 카테고리의 다른 글
asyncio 작업(task)으로 실행한 함수에서 값 얻어오기 (0) | 2020.07.29 |
---|---|
많은 좀비 프로세스를 이끄는 파이썬 멀티프로세싱 (0) | 2020.07.16 |
파이썬 리스트 차집합 연산 (2) | 2020.07.07 |
파이썬 소켓 수신 메소드에서 timeout을 정하는 방법? (0) | 2020.06.27 |
뉴욕 도시 시간을 어떻게 얻을 수 있습니까? (2) | 2020.06.23 |