Попробуйте / кроме того, чтобы не перехватить определенный тип исключения
Я пытаюсь поймать исключение определенного типа, которое выдается внутри вызова функции. Я заключил вызов функции в блок try / исключения, где блоком исключений выдается конкретное исключение. Я все еще получаю трассировку стека сбоя системы для этого исключения, если только я не включаю общий перехват для всех исключений. Включая этот блок и проверяя тип перехваченного исключения, я вижу, что он перехватывает тип исключения, которое я хотел перехватить в первом блоке. Понятия не имею, почему это происходит.
Контекст: работа над приложением Google App Engine с помощью webapp2 и ndb. Файловые функции имеют init.py, который импортирует все исключения из файла exceptions.py.
Макетный код и структура
Utils/ функции / exceptions.py
"""
Custom exception types
"""
class InvalidParamsException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
модели / models.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)))
Вывод, который я получу, если я не включу этот второй общий за исключением блока:
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!'
Если я включу второй блок, я изящно передам маршрут / функцию и увижу это в журналах:
DEBUG 2016-03-25 01:01:03,221 routes.py:66] EXCEPTION TYPE - <class 'utils.functions.exceptions.InvalidParamsException'>
Помощь / Руководство высоко ценится!
1 ответ
Похоже, что Python вызывает исключения как импортированные в текущем пространстве имен. Моим лучшим доказательством этого является тот факт, что последняя строка трассировки вызывает вызванное исключение "InvalidParamsException", а не "somemodule.InvalidParamsException".
Таким образом, я бы предложил разрешить конфликты в пространстве имен, явно импортировав исключение в пространство имен "rout.py":
from utils.functions.exceptions import InvalidParamsException
и перехват исключения по его теперь разрешенному имени пространства имен:
except InvalidParamsException as inv_param_exp:
<...>