2016-03-25 4 views
3

Ich versuche, einen bestimmten Typ der Ausnahme abzufangen, die in einem Funktionsaufruf ausgelöst wird. Ich habe den Funktionsaufruf in einen try/except-Block eingeschlossen, in dem der except-Block die spezifische Ausnahme abfängt, die ausgelöst wird. Ich bekomme immer noch eine System-Fail-Stack-Ablaufverfolgung für diese Ausnahme, es sei denn, ich schließe auch einen allgemeinen Catch für alle Ausnahmen ein. Wenn ich diesen Block einschließe und den Typ der Ausnahme überprüfe, die abgefangen wird, sehe ich, dass er den Typ der Ausnahme fängt, die ich im ersten Block fangen wollte. Keine Ahnung, warum das passiert.versuchen/außer einen bestimmten Typ der Ausnahme nicht abfangen

Kontext: Arbeiten an einer Google App Engine App mit Webapp2 und Ndb. Die Dateifunktionen hat eine init Py, der alle Ausnahmen von exceptions.py

Mock-Code und Struktur

utils/Funktionen/exceptions.py

""" 
Custom exception types 
""" 

class InvalidParamsException(Exception): 
def __init__(self, msg): 
    self.msg = msg 

def __str__(self): 
    return repr(self.msg) 

Modelle/Modelle importiert. py

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 
import utils.functions as func 
<--> 
class ModelClass(ndb.Model): 

    @classmethod 
    def new(cls): 
     <--> 
     raise func.InvalidParamsException("Invalid Params to function!") 
     <--> 

routes.py

import utils.functions as func 
from models import ModelClass 

class ModelClassHandler(webapp2.RequestHandler): 
    def post(self): 
     try: 
      new_model = ModelClass.new() 
     except func.InvalidParamsException as e: 
      logging.debug("Caught the right Exception!!") 
     except Exception as e: 
      logging.debug(":(") 
      logging.debug("EXCEPTION TYPE - %s"%str(type(e))) 

Die Ausgabe, die ich bekomme, wenn ich Block nicht, dass die zweite allgemeine umfassen außer ist:

Traceback (most recent call last): 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__ 
    rv = self.handle_exception(request, response, e) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__ 
    rv = self.router.dispatch(request, response) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
File "{{my_path}}/routes.py", line 58, in post 
    new_model = ModelClass.new() 
File "{{my_path}}/models/models.py", line 559, in new 
    raise func.InvalidParamsException("Invalid Params to function!") 
InvalidParamsException: 'Invalid Params to function!' 

Wenn ich den zweiten Block verstehen, gebe ich anmutig die Strecke/Funktion und sehen diese in den Protokollen:

DEBUG 2016-03-25 01:01:03,221 routes.py:66] EXCEPTION TYPE - <class 'utils.functions.exceptions.InvalidParamsException'> 

Hilfe/Anleitung sehr geschätzt !!

+0

'utils.functions.InvalidParamsException' und' utils.functions.exceptions.InvalidParamsException' wären zwei verschiedene Ausnahmen. Der, den Sie mit Ausnahme von Ausnahme fangen, sieht richtig aus; Ihr Versuch, 'func.InvalidParamsException' zu erzeugen, wenn' func' 'utils.functions' (nicht' utils.functions.exceptions') ist, wird nicht ausgeführt. – chepner

+0

Es scheint jedoch, dass Python den Importpfad verfolgen kann; Die Stelle, an der die Ausnahme ausgelöst wird, referenziert die Ausnahme auf dieselbe Weise wie der try/except-Block über das Funktionsmodul, das sie importiert hat. Weißt du irgendeinen Grund, warum es die beiden anders verfolgen würde? – bgenchel

+0

weiter, ich habe den ersten Block geändert, um func.exceptions.InvalidParamsExceptions zu fangen und sah immer noch das Problem. – bgenchel

Antwort

1

Es scheint, dass Python im aktuellen Namespace Ausnahmen importiert. Meine beste Erklärung hierfür ist die Tatsache, dass die letzte Zeile des Tracebacks die ausgelöste Ausnahme "InvalidParamsException" und nicht "somemodule.InvalidParamsException" aufruft.

Dadurch würde ich vorschlagen, die Namespace-Konflikte zu lösen ausdrücklich die Ausnahme in den Namensraum von „routes.py“ importieren:

from utils.functions.exceptions import InvalidParamsException

und fangen die Ausnahme durch seinen jetzt aufgelösten Namespace-Namen:

except InvalidParamsException as inv_param_exp: <...>