Python での例外処理について誰かと短い議論を交わした後 (キュー オブジェクトの処理に端を発して)、私はそれを捨てようと思いました...
方法 1:
import Queue
q = Queue.Queue()
try:
task=q.get(False)
#Opt 1: Handle task here and call q.task_done()
except Queue.Empty:
#Handle empty queue here
pass
#Opt2: Handle task here and call q.task_done()
方法 2:
import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
引数の 1 つは、キューが空であることはエラーではないため、方法 1 は間違っているため、Queue.Empty 例外を使用して処理すべきではないというものです。さらに、この方法でコーディングすると、タスク処理部分が潜在的に大きくなる可能性があると考えると、デバッグがより困難になる可能性があります。
もう 1 つの議論は、Python ではどちらの方法も受け入れられ、タスク処理が大きい場合、try/except の外でタスクを処理するとデバッグに役立つ可能性があるということです。
意見?
更新: 回答 1 の後のもう少しの情報.... 議論は、方法 1 がマルチスレッド コードで使用された後に開始されました。その場合、コードは (threading.Lock オブジェクトから) ロックを取得し、タスクが返されるか Queue.Empty がスローされるとロックを解放します。
更新 2: キュー オブジェクトがスレッド セーフであることは、私たち二人とも知りませんでした。try/except が最適なようです。