2014-01-24 6 views
6

diesen einfachen Flaschencode Gegeben:Flaschen-Middleware zum Abfangen von Ausnahmen eines bestimmten Typs?

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 

Wie würde eine Schreib Bottle-Middleware, so dass die gleiche Ausnahmebehandlung implizit durchgeführt wird, so dass der Code wie folgt identisch wie oben arbeiten kann:

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

Könnten Sie nicht einfach ableiten Ihre Ausnahme von bottle.HTTPResponse mit dem Exception-Typ und mache dann die entsprechende Sache, um damit zu beginnen oder ist die Quelle deiner Exception nicht Teil deiner Web-Anwendung und daher nicht schon abhängig von der Flasche? –

+0

Die Ausnahme wird von einer unabhängigen Bibliothek ausgelöst. Flasche ist nur ein Frontend dazu. – stackoverflowuser95

+1

Wäre ein [Flaschen-Plugin] (http://bottlepy.org/docs/dev/plugindev.html) ausreichend? –

Antwort

5

Sie können dies mit einem Plugin elegant tun:

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

Flasche Respekt die wsgi-Spezifikation Sie können eine klassische wsgi Middleware

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

Danke, aber gibt es eine Möglichkeit, wie ich die Fehlerausgabe (als JSON) anzeigen und den Statuscode setzen kann; ohne Umleitung? - Ich denke vielleicht ein Lambda im 'error_catcher' Block ... – stackoverflowuser95

+0

Es ist eine interne Umleitung. Und die Fehleransicht kann einige json zurückgeben. error_catcher ist eine wsgi-Anwendung, damit Sie tun können, was Sie wollen/brauchen. Lesen Sie mehr über wsgi-Anwendung: http://webpython.codepoint.net/wsgi_application_interface – gawel

+0

Also wie mache ich es ohne eine separate Funktion? - ZB: ein Lambda-Ansatz? – stackoverflowuser95

0

Sie diese stattdessen verwenden können:

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() 
Verwandte Themen