2016-03-25 6 views
3

私は関数呼び出しの中で投げられる特定のタイプの例外をキャッチしようとしています。 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!' 

私はその第二のブロックが含まれない場合、私は優雅にルート/関数を渡すと、これを参照してくださいログの中で:

ヘルプ/ガイダンス大歓迎!

+0

'utils.functions.InvalidParamsException'と' utils.functions.exceptions.InvalidParamsException'は2つの異なる例外です。あなたは例外を除いてキャッチしたものが正しく見える。 'func'が' utils.functions.exceptions'ではなく 'utils.functions'であるときに' func.InvalidParamsException'を発生させようとしていません。 – chepner

+0

これは、Pythonがインポートパスを追跡できるように見えます。例外が発生した場所は、try/exceptブロックがインポートした関数モジュールを通じてtry/exceptブロックと同じように例外を参照します。あなたは2つの異なる方法を追跡する理由を知っていますか? – bgenchel

+0

さらに、最初のブロックをfunc.exceptions.InvalidParamsExceptionsをキャッチするように変更したが、それでも問題がわかりました。 – bgenchel

答えて

1

現在の名前空間にインポートされた例外を発生させるようです。そのためには、トレースバックの最後の行で "somemodule.InvalidParamsException"ではなく "InvalidParamsException"という例外が呼び出されるという事実が私には間違いありません。

from utils.functions.exceptions import InvalidParamsException

とその今分解の名前空間名で例外をキャッチ:

これにより、私は「routes.py」の名前空間に明示的に例外をインポートする名前空間の競合を解決することをお勧め

except InvalidParamsException as inv_param_exp: <...>

関連する問題