2011-02-24 7 views
3

manage.pyで、例えばジャンゴを取り上げると本当に何が悪かったのか考え出しますかは `ImportError`が

さて、あなたはなどもちろん

あなたはexcept ImportError as e:を使用して、ちょうど実際のエラーメッセージをプリントアウトすることができますが、あなたはPATHで行っている可能性のあるすべてのもののためにガチョウを追いかける上で送信されているものであれば上記のような特定のエラーだけをキャッチして、本当に良いアドバイスをしたいのですか?

多かれ少なかれregexpを使用するか、「正しい」モジュールがインポートに失敗したと推測してメッセージを表示することになります。

これを処理するより良い方法はありますか?

+0

"しかし、特定のエラーだけを捕まえて、上のようなアドバイスを本当によくしたいのであれば、" "上記のコードは役に立つメッセージを表示します、間違っています。一般に、try/except処理を一切行わずにインポートエラーを修正するだけです。 –

+1

オプションのモジュールが見つかりませんでしたが、ユーザーが意図的ではなく構成エラーが原因で発生していることをユーザーに表示することがあります。 – ncoghlan

+0

@ncoghlan:これはなぜトレースバックより優れていますか?エラーが問題です。なぜそれをラップするのですか?それはどのように役立ちますか?問題は、単純に、エラーを「ラッピングする」ことは誤解を招くことです。なぜ、ラップされたエラーが誤解を招く場合は、エラーをラップするのですか? –

答えて

5

基本的には、エラーメッセージが間違っているという問題があります。間違ったパスだけでなくインポートが失敗する理由もあります。 ImportErrorは、単に「このモジュールを使用することはできません。トレースバックを見て理由を調べる」ことを意味しています。

「ファイルが見つかりません」と表示する場合は、ファイルを最初に探してください。 imp.find_moduleです。

+0

ありがとう - それは私が探していたものです。 – orokusaki

-1

私が本当にイライラしていることの1つは、インポートエラーをトラップすると、すぐに深いウサギの穴を下っているということです。

ヒントをご覧ください。

Do トラップインポートエラーがこれまでに発生しました。 manage.pyの例はベストプラクティスではありません。

しないでください。

インポートエラーは非常に、非常に稀です。

+0

私はPythonの異なるバージョンを扱うために同様のものを使用しなければなりませんでした。 'SafeConfigParser'と' ConfigParser'です。 –

+1

@S。 Lott - 私は永遠にエラーを "トラップ"するつもりはない。再調整するつもりであっても、問題がどこから発生するのかを知ることは制御フロー中にはうまくいきます。 – orokusaki

+0

@orokusaki:「問題がどこから来るのかを知るためには、制御フローの間にうれしいです」普通の、変更されていない、キャッチされていないインポート例外があなたに伝えているのはエラーです。すでに提供されている完全なエラーメッセージを変更するのはなぜですか? –

1

例外を伝播させたくない場合でも、エラーの何らかの兆候を示している場合を処理する最も簡単な方法は、印刷するメッセージに常に元の例外の詳細を含めることです。

try: 
    import settings 
except ImportError as exc: 
    sys.stderr.write("Error: failed to import settings module ({})".format(exc)) 

そうすれば、あなたは完全に他のインポートエラーを不明瞭にすることなく、(例えば、ユーザが間違った場所にその設定ファイルを置く、または設定エラーがどこかにありそうsys.pathが間違っている)一般的なケースでの明確なメッセージが表示されますsettingsモジュールの実行時に発生します。

ロギングモジュールを使用している場合は、ロギングイベントとしてdebug()またはinfo()として完全な例外の詳細を記録することもできます。

は、そのような部分文字列検索if 'settings' not in str(exc): raiseをやったりimp.find_module()を使って、その実行からのモジュールの位置を分離し、単に最悪の激論を防ぐのに十分である、元のエラーメッセージを含むなど、他のオプションがあります。