Python: Tratamento de Exceção de Queue.Empty
Depois de um curto debate com alguém sobre manipulação de exceções em Python - desencadeada pelo manuseio de um objeto de fila - pensei em jogá-lo lá fora ...
MÉTODO 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()
MÉTODO 2:import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
Um argumento é que o Método 1 está errado porque a fila está vazia não é um erro e, portanto, não deve ser manipulada usando a exceção Queue.Empty. Além disso, poderia tornar a depuração mais difícil quando codificada dessa forma se você considerar que a parte de manipulação de tarefas poderia ser grande.
O outro argumento é que uma das maneiras é aceitável no Python e que lidar com a tarefa fora do try / exceto pode ajudar a depurar se o tratamento de tarefas for grande, embora tenha concordado que isso pode parecer mais feio do que usar o Método 2.
Opiniões?
ATUALIZAÇÃO: Um pouco mais de informação depois que a resposta 1 apareceu ... O debate foi iniciado após o método 1 estar sendo usado em algum código multithread. Nesse caso, o código irá adquirir o bloqueio (de um objeto threading.Lock) e liberá-lo uma vez que a tarefa retornou ou Queue.Empty é lançada
UPDATE 2: Era desconhecido para nós dois que o objeto da fila era thread-safe. Parece que tentar / exceto é o caminho a percorrer!