2011-10-10 10 views
9

Pythonで異なる例外タイプを扱うときにコードの重複を避けるための良いパターンは何ですか?私はとHTTPError simlarではなく、かなりURLErrorを扱いたい:Python:例外を捕捉する際にコードの重複を避けるには?

try: 
    page = urlopen(request) 
except URLError, err: 
    logger.error("An error ocurred %s", err) 
except HTTPError, err: 
    logger.error("An error occured %s", err) 
    logger.error("Error message: %s", err.read()) 

をこの例では、私が最初にlogger.errorコールの重複を回避したいと思います。与えられたURLErrorはHTTPErrorの親は1がこのような何かを行うことができます:

except URLError, err: 
    logger.error("An error occurred %s", err) 
    try: 
     raise err 
    except HTTPError, err: 
     # specialization for http errors 
     logger.error("Error message: %s", err.read()) 
    except: 
     pass 

別のアプローチは、例えばでisinstanceを使用することです。 URLErrorとHTTPErrorが継承のチェーンではないだろう場合:1は私が好むはずです

except (URLError, HTTPError), err: 
    logger.error("An error occured %s", err) 
    if isinstance(err, HTTPError): 
     logger.error("Error message: %s", err.read()) 

、別のもっと良い方法はありますか?

答えて

10

私はあなたの3番目の例が最善の解決策だと思います。

  • それが重複
  • を回避最短バージョン
  • だ第二のバージョンとは異なりくらい、読んではっきりと従うことは簡単です。

Python 2.6以降を使用している場合は、新しいexcept FooError as err構文を使用することをおすすめします。

また、URLErrorハンドラが既にHTTPErrorにキャッチしているため、最初のバージョンが正しくないため、except HTTPError部分には決して到達しません。あなたは2つをexceptの周りに切り替えなければならないでしょう。これを使用しない別の理由。

+0

ありがとうTim!それは説得力があります。最初の例では、URLError、HTTPErrorの順番を確認しました。私はあなたの答えに言及したように、その例の問題を明確に示すので、質問を編集しません。 – Bernhard

関連する問題