4

私はFlaskを初めて使用します。ビューを作成するとき、すべてのエラーをキャッチする必要があるかどうか迷います。そうする場合、ほとんどのビューコードはtry...でラップする必要があります。優雅ではないと思います。

例えば。

@app.route('/')
def index():
    try:
        API.do()
    except:
        abort(503)

このようにコーディングする必要がありますか?そうでない場合、サービスはクラッシュしますか(uwsgi + lnmp)?

4

1 に答える 1

8

あなたはあなたが扱うことができるものだけを捕まえます。「ハンドル」という言葉は、単に「メッセージを印刷して死ぬ」だけでなく、「何か役に立つことをする」という意味です。プリントアンドダイはすでに例外メカニズムによって処理されており、おそらくあなたよりもうまく機能します。

たとえば、これは例外を有効に処理していません。

denominator = 0
try:
    y = x / denominator
except ZeroDivisionError:
    abort(503)

あなたができる有用なことは何もありません、そしてそれabortがとにかくキャッチされない例外が起こる原因となるので冗長です。便利な処理の例を次に示します。

try:
    config_file = open('private_config')
except IOError:
    config_file = open('default_config_that_should_always_be_there')

ただし、2番目のオープンが失敗した場合、それを行うのに役立つものは何もないことに注意してください。そうすると、コールスタックが上に移動し、プログラムが停止する可能性があります。except:何がどこで障害を起こしたのかについての情報を隠すので、絶対にやるべきではありません。これにより、「503であると言われているすべて」という欠陥レポートが表示され、何がうまくいかなかったのかわからない場合に、頭を悩ませる可能性がありますAPI.do()

有用な処理を実行できないブロックを試して/除外すると、コードが乱雑になり、実行のメインフローが視覚的に埋もれてしまいます。例外のない言語では、エラーリターンを自分で生成する場合にのみ、すべての呼び出しでエラーリターンをチェックする必要があります。そのコードノイズを取り除くために、例外が部分的に存在します。

于 2012-08-04T13:07:37.423 に答える