2013-12-16 26 views
5

エラーをテンプレートにマップするためのerrors.pyモジュールがあります。私は、デフォルトのエラーハンドラを追加したいと出くわした:http://flask.pocoo.org/mailinglist/archive/2012/7/12/default-error-handler/#cbeb8809dc0da7133f14b99e16f31d6bフラスコのデフォルトエラーハンドラが呼び出されていません

私は物事をモジュール化するBlueprintを使用していますし、エラーのモジュールは、以下のマッピングがあります。

@err.app_errorhandler(403) 
def forbidden(e): 
    return render_template('403.html'), 403 

@err.app_errorhandler(500) 
def serverError(e): 
    return render_template('500.html'), 500 

@err.app_errorhandler(Exception) 
def defaultHandler(e): 
    return render_template('defaultError.html'), e.code 

固有のマッピング(403、500)私がそれらに中止する(または自然に誘導する)場合はうまく動作しますが、他のもの(404など)にアボートすると、defaulHandler()は呼び出されません。

答えて

1

デフォルトのハンドラは、「doesnのように、404が実際にフラスココードで例外を発生させていないことが表示されますヒットする理由がない。私はraise Exceptionを私のURLマッピングの1つに加えてそれにナビゲートすれば、それを打つことができます。

もちろん、500のエラーマッピングがある場合、例外はサーバー側のエラーになり、そのキャッチメントに落ちるので、この時点で例外のキャッチを使用することに失敗しています500 errorhandlerがそうでないものをキャッチするケースは考えられません)。

0

render_template('defaultError.html')e.codeが例外を発生させないことを確認してください。たとえば、私は、任意のあなたの例外がcode属性を持つことができることを確認しないんだけど、非常に簡単な例を試してみてください。

@err.app_errorhandler(Exception) 
def defaultHandler(e): 
    return 'error handler there', 500 
+0

ませ例外は、私が(フラスコ内に構築されたサーバを使用して実行されている)を識別できることを提起しないされています。とにかく私の500マッピングがヒットしたと思いました。 – bqui56

+0

私にとっては、 'flask == 0.10.1'と' wergzeug = 0.9.4'でうまく動作します。ユーザー例外については、コードがhttps://github.com/mitsuhiko/flask/blob/master/flask/app.py#L1475で処理されなかった理由が考えられます。 – tbicr

2

あなたはこのようにこれを行うことができます:

app.config['TRAP_HTTP_EXCEPTIONS']=True 
app.register_error_handler(Exception, defaultHandler) 
+0

これは、ありがとう:) – mucio