2014-01-24 2 views
6

Учитывая этот простой код бутылки:Бутылочное промежуточное программное обеспечение для исключения исключений определенного типа?

def bar(i): 
    if i%2 == 0: 
     return i 
    raise MyError 

@route('/foo') 
def foo(): 
    try: 
     return bar() 
    except MyError as e: 
     response.status_code = e.pop('status_code') 
     return e 

Как бы одна запись бутылки промежуточного слоя так же обработка исключений выполняется неявно, так что код, как это может работать одинаково выше:

@route('/foo') 
def foo(): 
    return bar() 
+0

Не могли бы вы просто не получить ваше исключение из bottle.HTTPОтказать с типом исключения, затем делать подходящую вещь, чтобы начать с или является источником вашего исключения, а не частью вашего веб-приложения и, следовательно, не зависит от бутылки? –

+0

Исключение выбрасывается из независимой библиотеки; Бутылка - это только один интерфейс. – stackoverflowuser95

+1

Достаточно ли [Плагин для бутылок] (http://bottlepy.org/docs/dev/plugindev.html)? –

ответ

5

Вы можете сделать это элегантно с плагином:

def error_translation(func): 
    def wrapper(*args,**kwargs): 
     try: 
      func(*args,**kwargs) 
     except ValueError as e: 
      abort(400, e.message) 
    return wrapper 

app.install(error_translation) 
4

бутылки уважение спецификация wsgi. Вы можете использовать классический WSGI промежуточного программного

from bottle import route, default_app, run, request 

# push an application in the AppStack 
default_app.push() 


@route('/foo') 
def foo(): 
    raise KeyError() 


# error view 
@route('/error') 
def error(): 
    return 'Sorry an error occured %(myapp.error)r' % request.environ 


# get the bottle application. can be a Bottle() instance too 
app = default_app.pop() 
app.catchall = False 


def error_catcher(environ, start_response): 
    # maybe better to fake the start_response callable but this work 
    try: 
     return app.wsgi(environ, start_response) 
    except Exception as e: 
     # redirect to the error view if an exception is raised 
     environ['PATH_INFO'] = '/error' 
     environ['myapp.error'] = e 
     return app.wsgi(environ, start_response) 


# serve the middleware instead of the applicatio 
run(app=error_catcher) 
+0

Спасибо, но есть ли способ показать вывод ошибки (как JSON) и установить код состояния; без перенаправления? - Я думаю, может быть, лямбда в блоке 'error_catcher' ... – stackoverflowuser95

+0

Это внутренняя переадресация. И представление ошибки может вернуть некоторый json. error_catcher - это приложение wsgi, поэтому вы можете делать то, что вам нужно. Подробнее о приложении wsgi: http://webpython.codepoint.net/wsgi_application_interface – gawel

+0

Итак, как мне это сделать без отдельной функции? - Например: лямбда-подход? – stackoverflowuser95

0

Вы можете использовать вместо этого:

from bottle import error, run, route 

@error(500) 
def error_handler_500(error): 
    return json.dumps({"status": "error", "message": str(error.exception)}) 

@route("/") 
def index(): 
    a = {} 
    a['aaa'] 

run()