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 !!
'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
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
weiter, ich habe den ersten Block geändert, um func.exceptions.InvalidParamsExceptions zu fangen und sah immer noch das Problem. – bgenchel