2017-07-18 30 views
1

我想用urllib處理HTTPError。 我的設置是使用Django 1.10的anaconda virtualenv中的python3。 當代碼得到try,它不會進入except和Django崩潰我的頁面告訴我有一個HTTP錯誤。urllib HTTPError沒有在Python/Django中被捕獲

下面是代碼:

from urllib.request import Request, urlopen 
from urllib.error import URLError, HTTPError 

try: 
    req = Request(api.lists.members.get(LIST_ID, client_email)) 
    response = urlopen(req) 
except HTTPError as e: 
    print('Error code: ', e.code) 
else: 
    print('everything is fine') 

TRACEBACK:

環境:

Request Method: POST 
Request URL: http://127.0.0.1:8000/homepage/ 

Django Version: 1.10 
Python Version: 3.6.1 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'website'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/plfiras/vinhood/vinhood-website/website/views.py" in homepage 
    52.    conn = http.client.HTTPConnection(api.lists.members.get(LIST_ID, client_email)) 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/mailchimp3/entities/listmembers.py" in get 
    116.   return self._mc_client._get(url=self._build_path(list_id, 'members', subscriber_hash), **queryparams) 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/mailchimp3/mailchimpclient.py" in wrapper 
    25.    return fn(self, *args, **kwargs) 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/mailchimp3/mailchimpclient.py" in _get 
    100.    r.raise_for_status() 

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/requests/models.py" in raise_for_status 
    928.    raise HTTPError(http_error_msg, response=self) 

Exception Type: HTTPError at /homepage/ 
Exception Value: 404 Client Error: Not Found for url: https://us13.api.mailchimp.com/3.0/lists/7bdb42e5c9/members/d071e758df3554f0fe89679212ef95e8 
+0

發佈回溯 –

+0

@ArpitSolanki完成! –

+0

在我的系統上試過你的代碼和它的工作狀態非常好 –

回答

-1

出於某種原因,並沒有追趕HTTPError。 通過用Exception替換HTTPError,它可以工作。

from urllib.request import Request, urlopen 
from urllib.error import URLError, HTTPError 

try: 
    req = Request(api.lists.members.get(LIST_ID, client_email)) 
    response = urlopen(req) 
except Exception as e: 
    print('Error code: ', e.code) 
else: 
    print('everything is fine') 
1

您正在捕捉錯誤的異常。看看你回溯的最後一行:

File "/Users/plfiras/anaconda/lib/python3.6/site-packages/requests/models.py" in raise_for_status 
    928. raise HTTPError(http_error_msg, response=self) 

requests/models.py線31看一看,你會看到以下內容:

from .exceptions import (
HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, 
ContentDecodingError, ConnectionError, StreamConsumedError) 

正如你可以看到HTTPError被實際募集來自requests/exceptions.py。看看該文件的頂部,你會看到:

from urllib3.exceptions import HTTPError as BaseHTTPError 


class RequestException(IOError): 
    """There was an ambiguous exception that occurred while handling your 
    request. 
    """ 

    def __init__(self, *args, **kwargs): 
     """Initialize RequestException with `request` and `response` objects.""" 
     response = kwargs.pop('response', None) 
     self.response = response 
     self.request = kwargs.pop('request', None) 
     if (response is not None and not self.request and 
       hasattr(response, 'request')): 
      self.request = self.response.request 
     super(RequestException, self).__init__(*args, **kwargs) 


class HTTPError(RequestException): 
    """An HTTP error occurred.""" 

這表明HTTPError被導入爲BaseHTTPError,並請求庫已經實現了它自己的HTTPError不延伸urlib3.HTTPError 。

所以抓住你需要從請求模塊導入HTTPError錯誤,不urlib,就像這樣:

from requests.exceptions import HTTPError 

try: 
    req = Request(api.lists.members.get(LIST_ID, client_email)) 
    response = urlopen(req) 
except HTTPError as e: 
    print('Error code: ', e.code) 
else: 
    print('everything is fine')