2016-09-07 3 views
1

ビットそのように見えたコードの一部をテストしながら、私が驚い持っ:エラーが発生しても、try-except節は実行されません。

if x: 
    try: 
      obj = look-for-item-with-id==x in a db 
      if obj is None: 
       # print debug message 
       raise NotFound('No item with this id') 
      return obj 
    except Exception, e: 
     raise Error(e.message) 

Iは、DB内に設けられたID(X)とは項目がなかった場合に予想される、NOTFOUND例外があろう上昇させること。しかし、代わりに、if節に行き、デバッグメッセージを出力した後、それはexcept節に到達し、Exception(excメッセージがItem not found ...)になります。誰かがとても親切で私をここで啓発することができますか?

+2

あなたは 'NotFound'を上げて、それを捕まえ、代わりに' Error'を上げています。何が起こると思いますか? – tzaman

+0

さて、私は今それを得る。レイズは句をエスケープしませんが、代わりにキャッチされます。私の上に恥ずかしがり屋: – fanny

答えて

1

項目が含まれていませんあなたのNotFoundを含むそのブロック内で育ちましょう。

NotFound自体をさらに伝播させたい場合は、try/exceptブロックをまったく持っている必要はありません。あなたはNotFoundを検出したが、その後同じ例外を伝播継続する場合、特定の何かをしたい場合は

あるいは、あなたの代わりにあなたがやっているように、新たな例外を発生させるのにそれを再調達する空白raiseステートメントを使用することができます。以下のようなもの:

try: 
    # .. do stuff 
    if blah: 
    raise NotFound(...) 
except NotFound, e: 
    # print something 
    raise 

はまた、私はexcept NotFoundに例外ブロックを変更したことに注意してください - それはあなたが期待していない可能性があり、エラーを非表示にすることができ、すべてを、キャッチのでexcept Exceptionを使用することが一般的に良いアイデアではありません。基本的には、exceptを使用して、の特定のものをキャッチしたいと思っています。

+0

私はそれを次のように解決しました:try:except NotFound:例外blah blahを除くblah blah。私が望んでいたのは、アイテムが見つかったかどうかを確認することでした。そうでない場合は、RAISE NotFoundにして、それが発生しなかった場合は、他のすべての問題をチェックします(例外はあまりにも広い用語です。私の場合はdbエラー)。私の主な間違いは、NotFoundを発生させることがNotFoundとして提出されると想定することでした。私は例外についてもっと読む必要があります。とにかく、私はあなたの答えを受け入れる:) – fanny

-1

objが長さやアイテムのカウントがゼロ ある場合、配列は確認してくださいある場合、これは、OBJない何を意味していないが、あなたはexcept Exception, e:を言うとき、あなたは明示的かもしれません(ほとんど)すべての例外をキャッチしている

+0

ありがとう、しかしobjはありません...私はその上でいくつかのデバッグを行った – fanny

+1

fannyは 'obj:Noneではない'をテストしています、 'obj:'ではないので、空の "リストはここでは適用されません。 –

関連する問題