2013-09-05 8 views
3

Я попытался использовать функции Exception предложил о том, как обрабатывать исключения:обработка в Python (webapp2, Google App Engine)

http://webapp-improved.appspot.com/guide/exceptions.html

в main.py:

def handle_404(request, response, exception): 
     logging.exception(exception) 
     response.write('404 Error') 
     response.set_status(404) 

def handle_500(request, response, exception): 
    logging.exception(exception) 
    response.write('A server error occurred!') 
    response.set_status(500) 

class AdminPage(webapp2.RequestHandler): 
    def get(self): 
    ... 
    admin_id = admin.user_id() 
    queues = httpRequests.get_queues(admin_id) 

app = webapp2.WSGIApplication(...) 

app.error_handlers[404] = handle_404 
app.error_handlers[500] = handle_500 

Функция в httpRequests.py:

def get_queues(admin_id): 

    url = "http://localhost:8080/api/" + admin_id + "/queues" 
    result = urlfetch.fetch(url) 

    if (result.status_code == 200): 
     received_data = json.loads(result.content) 
     return received_data 

Функция, которая вызывается в A PI:

class Queues(webapp2.RequestHandler): 
    def get(self, admin_id): 
     queues = queues(admin_id) 
     if queues == []: 
      self.abort(404) 
     else: 
      self.response.write(json.dumps(queues)) 

Я застрял в get_queues в httpRequests.py. Как обрабатывать исключения HTTP с помощью urlfetch?

+0

Там вы идете 'если result.status_code == 200:' – topless

+0

Это не обработка исключений. Я хотел что-то похожее на: try: urllib2.urlopen (url) за исключением urllib2.HTTPError, e: print e.code, но с urlfetch – user2653179

ответ

3

Другой подход для обработки ошибок состоит в том, чтобы сделать BaseHandler с handle_exception и у вас есть все остальные обработчики. Полностью рабочий пример будет выглядеть следующим образом:

import webapp2 
from google.appengine.api import urlfetch 

class BaseHandler(webapp2.RequestHandler): 
    def handle_exception(self, exception, debug_mode): 
    if isinstance(exception, urlfetch.DownloadError): 
     self.response.out.write('Oups...!') 
    else: 
     # Display a generic 500 error page. 
     pass 

class MainHandler(BaseHandler): 
    def get(self): 
    url = "http://www.google.commm/" 
    result = urlfetch.fetch(url) 
    self.response.write('Hello world!') 


app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
    ], debug=True) 

Даже лучшим решением было бы бросить исключение, поскольку они при работе в режиме отладки и обработки их в более дружественным способом при работе на производстве. Взятые из another example вы могли бы сделать что-то подобное для BaseHandler и расширить его, как вы хотите:

class BaseHandler(webapp2.RequestHandler): 
    def handle_exception(self, exception, debug_mode): 
    if not debug_mode: 
     super(BaseHandler, self).handle_exception(exception, debug_mode) 
    else: 
     if isinstance(exception, urlfetch.DownloadError): 
     # Display a download-specific error page 
     pass 
     else: 
     # Display a generic 500 error page. 
     pass 
+0

Спасибо за ответ, но я все еще не уверен, как проверить результат = urlfetch.fetch (url) ", что у меня есть исключение 404 и т. д. – user2653179

Смежные вопросы