私は関数呼び出しの中で投げられる特定のタイプの例外をキャッチしようとしています。 try/exceptブロックの中で関数呼び出しを囲みました。そこでは、exceptブロックがスローされる特定の例外をキャッチします。私はまだすべての例外に対して一般的なキャッチが含まれていない限り、その例外のシステム・スタック・トレースを取得します。そのブロックを含め、キャッチされている例外のタイプをチェックすると、最初のブロックでキャッチしたい例外のタイプをキャッチしていることがわかります。なぜこれが起こっているのか分かりません。try/except特定のタイプの例外をキャッチしていません
コンテキスト:webapp2とndbを使用してGoogleアプリケーションエンジンアプリケーションを処理しています。ファイル関数は、のinit exceptions.py
モックコードからのすべての例外をインポートの.pyと構造
utilsの/機能/ exceptions.py
"""
Custom exception types
"""
class InvalidParamsException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
モデル/モデルがあります。 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!'
私はその第二のブロックが含まれない場合、私は優雅にルート/関数を渡すと、これを参照してくださいログの中で:
ヘルプ/ガイダンス大歓迎!
'utils.functions.InvalidParamsException'と' utils.functions.exceptions.InvalidParamsException'は2つの異なる例外です。あなたは例外を除いてキャッチしたものが正しく見える。 'func'が' utils.functions.exceptions'ではなく 'utils.functions'であるときに' func.InvalidParamsException'を発生させようとしていません。 – chepner
これは、Pythonがインポートパスを追跡できるように見えます。例外が発生した場所は、try/exceptブロックがインポートした関数モジュールを通じてtry/exceptブロックと同じように例外を参照します。あなたは2つの異なる方法を追跡する理由を知っていますか? – bgenchel
さらに、最初のブロックをfunc.exceptions.InvalidParamsExceptionsをキャッチするように変更したが、それでも問題がわかりました。 – bgenchel