2012-03-07 11 views
2

私は今しばらくの間、Pythonでアマチュアのコーディングを行うと、それで非常に快適に感じてきました。最近、私は最初のデーモンを書いていましたが、私のプログラムがどのように流れていくのかという言葉に出ようとしています。私の過去のプログラムでPythonのデーモン - プログラムの構造と例外制御

、例外は、おそらくいくつかのマイナーなクリーニングアップした後、単にプログラムを中止によって処理することができます。プログラム構造に与えなければならなかった唯一の考慮点は、非例外入力の効果的な処理でした。事実、「ゴミを入れて、何も出ない」。私のデーモンで

は、効果的に決して終わりません外ループと物事が起こる間隔を制御するため、その中にスリープ記載があります。有効な入力データの処理は簡単ですが、私は例外を処理するためのベストプラクティスを理解するのに苦労しています。場合によっては、ネストされた関数のいくつかのレベル内で例外が発生し、それぞれが親に何かを返す必要があります。制御が最も外側のループに戻るまで、親に何かを返す必要があります。各関数は、それ自身のためだけでなくそのすべての従属要素についても例外条件を処理することができなければなりません。

私は私の質問の曖昧さを謝るが、誰もがこれらの例外を処理する方法に私にいくつかの一般的な指針を提供することができれば、私は思ったんだけど。親に影響を与えることなく終了することができるサブプロセスを生成することを検討する必要がありますか? (リモートの)可能性は、私が正しくやっていることであり、実際にそのネストされた処理をすべて必要としているということです。もう一つの非常に現実的な可能性は、私が何を話しているかの手がかりを得ていないということです。 :)

スティーブ

答えて

0

答えは "それに依存します"。

一部の低水準機能で例外が発生した場合、例外にもかかわらず機能を正常に完了させるために十分な情報がこのレベルで利用できる場合は、そこにキャッチすることが適切な場合があります。例えば。 .stlファイルから三角形を読み込むとき、三角形の法線ベクトルは、三角形を構成する3つの点のシーケンスによって明示的に与えられ、暗黙的に与えられる。そう法線ベクトルを安全トライアングルクラスのコンストラクタでキャッチすることができる長さ0のベクトルであり、法線ベクトルクラスのコンストラクタで例外をトリガしなければならない(0,0,0)、として与えられた場合、それは他の手段によって計算することができるからです。

例外を処理するのに十分な情報がない場合は、処理可能なレベルまで上向きにトリクルされます。例えば。ファイルフォーマットを読み込んで解釈するモジュールを作成する場合、指定されたファイルがファイルフォーマットと一致しない場合、例外が発生するはずです。この場合、例外を処理してユーザーと通信する必要があるのは、おそらくそのモジュールを使用しているプログラムの最上位レベルです。

3

例外は、(潜在的に)キャッチされないように設計されています。つまり、関数が "エラー"。各例外は、それについて何かしたい(そしてできる)レベルでキャッチすることができます。最低で

、あなたはメインループですべての例外をキャッチし、メッセージをロギングすることで開始することができます。これは簡単で、デーモンが死ぬことはありません。メインループでは、ほとんどの問題を修正するには遅すぎる可能性があるので、特定の例外を早く見つけ出すことができます。例えば。ファイルの形式が間違っている場合は、開いているルーチンで例外をキャッチし、問題が検出された解析コードの深部ではなくファイルを使用しようとします。おそらくあなたは別のフォーマットを試すことができます。基本的に、特定のエラー状態から回復できる場所がある場合は、その場所にキャッチしてください。

+0

私が理解していなかった部分は、私が望むレベルで例外をキャッチしていました。私は例外を発生させてより高いレベルでそれをキャッチすることができたことに感謝しませんでした。これにより、すべての機能レベルを一番外側のループに戻すことよりもはるかに簡単になります。 – Steve

+0

私は助けてくれてうれしいです。あなたは新しいので、あなたの質問に答えることがわかったら、私の答えを "受け入れてください"。 – alexis