Python: Queue.Empty Manejo de excepciones

Después de un breve debate con alguien sobre el manejo de excepciones en Python, provocado por el manejo de un objeto de cola, pensé que lo tiraría por ahí ...

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()

Un argumento es que el Método 1 es incorrecto porque la cola que está vacía no es un error y, por lo tanto, no debe manejarse con la excepción Queue.Empty. Además, podría hacer que la depuración sea más difícil cuando se codifica de esta manera si considera que la parte de manejo de tareas podría ser potencialmente grande.

El otro argumento es que de cualquier manera es aceptable en Python y que el manejo de la tarea fuera del intento / excepto podría ayudar a depurar si el manejo de la tarea es grande, aunque se acordó que esto podría parecer más feo que usar el Método 2.

Opiniones?

ACTUALIZACIÓN: Un poco más de información después de que llegó la respuesta 1 ... El debate se inició después de que el método 1 se usara en algunos códigos de multiproceso. En cuyo caso, el código adquirirá el bloqueo (de un objeto threading.Lock) y lo liberará una vez que se haya lanzado la tarea que devolvió o Queue.Empty

ACTUALIZACIÓN 2: Los dos desconocíamos que el objeto de cola era seguro para subprocesos. Parece que intentar / excepto es el camino a seguir!

Respuestas a la pregunta(3)

Su respuesta a la pregunta