¿Por qué es "excepto: pasar" una mala práctica de programación?


A menudo veo comentarios en otras preguntas de desbordamiento de pila sobre cómo se desaconseja el uso de except: pass. ¿Por qué es tan malo? A veces simplemente no me importa cuáles son los errores, y quiero continuar con el código.

try:
    something
except:
    pass

¿Por qué usar un bloque except: pass es malo? ¿Qué lo hace malo? ¿Es el hecho de que yo pass en un error o que yo except cualquier error?

Author: TylerH, 2014-02-04

15 answers

Como has adivinado correctamente, hay dos caras en esto: Capturar cualquier error especificando ningún tipo de excepción después de except, y simplemente pasarlo sin tomar ninguna acción.

Mi explicación es" un poco " más larga, así que tl; dr se descompone en esto:

  1. No cojas ningún error . Siempre especifique de qué excepciones está preparado para recuperarse y solo capturarlas.
  2. Trate de evitar pasar excepto los bloques. Excepto explícitamente deseado, esto generalmente no es una buena señal.

Pero vamos a entrar en detalles:

No cojas ningún error

Cuando se usa un bloque try, generalmente lo hace porque sabe que existe la posibilidad de que se lance una excepción. Como tal, también ya tiene una idea aproximada de lo que puede romper y qué excepción se puede lanzar. En tales casos, se obtiene una excepción porque puede recuperar positivamente de ella. Eso significa que está preparado para la excepción y tiene algún plan alternativo que seguirá en caso de esa excepción.

Por ejemplo, cuando le pide al usuario que ingrese un número, puede convertir la entrada usando int() que podría generar un ValueError. Puede recuperar fácilmente eso simplemente pidiéndole al usuario que lo intente de nuevo, por lo que atrapar el ValueError y preguntar al usuario de nuevo sería un plan apropiado. Un ejemplo diferente sería si desea leer alguna configuración de un archivo, y ese archivo no existe. Debido a que es un archivo de configuración, es posible que tenga alguna configuración predeterminada como alternativa, por lo que el archivo no es exactamente necesario. Así que la captura de un FileNotFoundError y simplemente aplicar la configuración predeterminada sería un buen plan aquí. Ahora bien, en ambos casos, tenemos una excepción muy específica que esperamos y tenemos un plan igualmente específico para recuperarnos de ella. Como tal, en cada caso, solo explícitamente except que cierto salvedad.

Sin embargo, si tuviéramos que atrapar todo, entonces-además de esas excepciones de las que estamos dispuestos a recuperarnos-también hay una posibilidad de que obtengamos excepciones que no esperábamos, y de las que de hecho no podemos recuperarnos; o no deberíamos recuperarnos.

Tomemos el ejemplo del archivo de configuración de arriba. En caso de que falte un archivo, simplemente aplicamos nuestra configuración predeterminada, y podríamos decidir en un momento posterior guardar automáticamente la configuración (por lo que la próxima vez, el archivo existe). Ahora imagina que tenemos un IsADirectoryError, o a PermissionError en su lugar. En tales casos, probablemente no queremos continuar; todavía podríamos aplicar nuestra configuración predeterminada, pero más tarde no podremos guardar el archivo. Y es probable que el usuario también tenga una configuración personalizada, por lo que es probable que no se desee usar los valores predeterminados. Así que querríamos decirle al usuario sobre ello inmediatamente, y probablemente abortar la ejecución del programa también. Pero eso no es algo que quiere hacer algo profundo dentro de una pequeña parte del código; esto es algo de importancia a nivel de aplicación, por lo que debe ser manejado en la parte superior, así que deje que la excepción burbujee.

Otro ejemplo simple también se menciona en el documento Python 2 modoms. Aquí, existe un simple error tipográfico en el código que hace que se rompa. Porque estamos alcanzando cada excepción, también podemos coger NameErrors y SyntaxErrors. Ambos son errores que nos suceden a todos mientras programación; y ambos son errores que absolutamente no queremos incluir al enviar el código. Pero debido a que también los atrapamos, ni siquiera sabremos que ocurrieron allí y perderemos cualquier ayuda para depurarlo correctamente.

Pero también hay excepciones más peligrosas para las que es poco probable que estemos preparados. Por ejemplo SystemError es generalmente algo que sucede raramente y que realmente no podemos planificar; significa que hay algo más complicado sucediendo, algo que probablemente nos impide continuar con la tarea actual.

En cualquier caso, es muy poco probable que esté preparado para todo en una parte a pequeña escala del código, por lo que es realmente donde solo debe capturar aquellas excepciones para las que está preparado. Algunas personas sugieren al menos atrapar Exception ya que no incluirá cosas como SystemExit y KeyboardInterrupt que por diseño son para terminar su solicitud, pero yo diría que esto todavía es demasiado inespecífico. Solo hay un lugar donde personalmente acepto capturar Exception o simplemente cualquier excepción, y eso es en un solo controlador de excepciones a nivel de aplicación global que tiene el único propósito de registrar cualquier excepción para la que no estábamos preparados. De esa manera, todavía podemos retener tanta información sobre excepciones inesperadas, que luego podemos usar para extender nuestro código para manejarlas explícitamente (si podemos recuperarnos de ellas) o-en caso de un error-para crear casos de prueba para asegurarnos de que no vuelva a suceder. Pero por supuesto, que sólo funciona si solo alguna vez atrapamos esas excepciones que ya estábamos esperando, por lo que las que no esperábamos naturalmente burbujearán.

Trate de evitar pasar excepto bloques

Al capturar explícitamente una pequeña selección de excepciones específicas, hay muchas situaciones en las que estaremos bien simplemente sin hacer nada. En tales casos, solo tener except SomeSpecificException: pass está bien. La mayoría de las veces, sin embargo, este no es el caso, ya que es probable que necesitemos algún código relacionado con el proceso de recuperación (como antes mencionado). Esto puede ser, por ejemplo, algo que reintenta la acción de nuevo, o para configurar un valor predeterminado en su lugar.

Si ese no es el caso, por ejemplo, porque nuestro código ya está estructurado para repetirse hasta que tenga éxito, entonces simplemente pasar es suficiente. Tomando nuestro ejemplo de arriba, es posible que queramos pedirle al usuario que ingrese un número. Porque sabemos que a los usuarios les gusta no hacer lo que les pedimos, podríamos ponerlo en un bucle en primer lugar, para que parezca esto:

def askForNumber ():
    while True:
        try:
            return int(input('Please enter a number: '))
        except ValueError:
            pass

Debido a que seguimos intentando hasta que no se lance ninguna excepción, no necesitamos hacer nada especial en el bloque except, así que esto está bien. Pero, por supuesto, uno podría argumentar que al menos queremos mostrar al usuario algún mensaje de error para decirle por qué tiene que repetir la entrada.

En muchos otros casos, sin embargo, solo pasar un except es una señal de que realmente no estábamos preparados para la excepción que estamos atrapando. A menos que esas excepciones sean simples (como ValueError o TypeError), y la razón por la que podemos pasar es obvia, trate de evitar simplemente pasar. Si realmente no hay nada que hacer (y está absolutamente seguro de ello), considere agregar un comentario por qué es así; de lo contrario, expanda el bloque except para incluir realmente algún código de recuperación.

except: pass

Sin embargo, el peor delincuente es la combinación de ambos. Esto significa que estamos voluntariamente captando cualquier error aunque no estamos absolutamente preparados para ello y tampoco lo hacemos cualquier cosa al respecto. al menos desea registrar el error y también es probable que lo vuelva a subir para terminar la aplicación (es poco probable que pueda continuar como siempre después de un error de memoria). Sin embargo, solo pasar no solo mantendrá la aplicación un poco viva (dependiendo de dónde la atrape, por supuesto), sino que también desechará toda la información, lo que hará imposible descubrir el error, lo que es especialmente cierto si no es usted quien lo descubre.


Así que la línea de fondo es: Atrapa solo las excepciones que realmente esperas y estás preparado para recuperarte; todos los demás son probablemente errores que debes corregir, o algo para lo que no estás preparado de todos modos. Pasar excepciones específicas está bien si realmente no necesita hacer algo al respecto. En todos los demás casos, es solo un signo de presunción y de ser perezoso. Y definitivamente quieres arreglar eso.

 279
Author: poke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-28 20:24:09

El principal problema aquí es que ignora todo y cualquier error: Falta de memoria, la CPU se está quemando, el usuario quiere detenerse, el programa quiere salir, Jabberwocky está matando usuarios.

Esto es demasiado. En tu cabeza, estás pensando "Quiero ignorar este error de red". Si algo inesperado sale mal, entonces su código continúa silenciosamente y se rompe de maneras completamente impredecibles que nadie puede depurar.

Es por eso que debe limitarse a ignorar específicamente solo algunos errores y dejar pasar el resto.

 256
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 19:36:29

Ejecutar tu pseudo código literalmente ni siquiera da ningún error:

try:
    something
except:
    pass

Como si fuera un código perfectamente válido, en lugar de lanzar un NameError. Espero que esto no sea lo que quieres.

 70
Author: YS-L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 13:14:27

¿Por qué es "excepto: pasar" una mala práctica de programación?

¿Por qué es esto malo?

try:
    something
except:
    pass

Esto incluye todas las excepciones posibles, incluyendo GeneratorExit, KeyboardInterrupt, y SystemExit - que son excepciones que probablemente no tiene la intención de atrapar. Es lo mismo que atrapar BaseException.

try:
    something
except BaseException:
    pass

Las versiones anteriores de de la documentación de dicen :

Dado que cada error en Python genera una excepción, usar except: puede producir muchos errores de programación parecen problemas de tiempo de ejecución, lo que dificulta el proceso de depuración.

Jerarquía de Excepciones de Python

Si captura una clase de excepción padre, también captura todas sus clases hijas. Es mucho más elegante para atrapar solo las excepciones que está preparado para manejar.

Aquí está la jerarquía de excepciones de Python 3 - ¿realmente quieres atraparlos a todos?:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

No Hagas esto

Si está utilizando esta forma de excepción manipulación:

try:
    something
except: # don't just do a bare except!
    pass

Entonces no podrá interrumpir su bloque something con Ctrl-C. Su programa pasará por alto todas las posibles excepciones dentro del bloque de código try.

Aquí hay otro ejemplo que tendrá el mismo comportamiento indeseable: {[18]]}

except BaseException as e: # don't do this either - same as bare!
    logging.info(e)

En su lugar, intente capturar solo la excepción específica que sabe que está buscando. Por ejemplo, si sabe que puede obtener un valor-error en una conversión:

try:
    foo = operation_that_includes_int(foo)
except ValueError as e:
    if fatal_condition(): # You can raise the exception if it's bad,
        logging.info(e)   # but if it's fatal every time,
        raise             # you probably should just not catch it.
    else:                 # Only catch exceptions you are prepared to handle.
        foo = 0           # Here we simply assign foo to 0 and continue. 

Otra explicación con otro ejemplo

Es posible que lo esté haciendo porque ha estado raspando web y ha estado obteniendo, por ejemplo, un UnicodeError, pero debido a que ha utilizado la captura de excepciones más amplia, su código, que puede tener otros defectos fundamentales, intentará ejecutarse hasta completarse, desperdiciando ancho de banda, tiempo de procesamiento, desgaste de su equipo, se quedará sin memoria, recopilando datos basura, etc.

Si otras personas te están pidiendo que completes para que puedan confiar en tu código, entiendo que te sientas obligado para manejar todo. Pero si está dispuesto a fallar ruidosamente a medida que se desarrolla, tendrá la oportunidad de corregir problemas que solo pueden aparecer intermitentemente, pero que serían errores costosos a largo plazo.

Con un manejo de errores más preciso, el código puede ser más robusto.

 43
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-21 15:10:34
>>> import this

El Zen de Python, por Tim Peters

Lo bello es mejor que lo feo.
Lo explícito es mejor que lo implícito.
Simple es mejor que complejo.
Complejo es mejor que complicado.
Plano es mejor que anidado.
Disperso es mejor que denso.
La legibilidad cuenta.
Los casos especiales no son lo suficientemente especiales como para romper las reglas.
Aunque la practicidad vence a la pureza.
Los errores nunca deben pasar en silencio.
Excepto explícitamente silenciado.
Frente a la ambigüedad, rechaza la tentación de adivinar.
Debería haber una obvious y preferiblemente sólo una obvious forma obvia de hacerlo.
Aunque esa forma puede no ser obvia al principio a menos que seas holandés.
Ahora es mejor que nunca.
Aunque nunca es a menudo mejor que bien ahora.
Si la implementación es difícil de explicar, es una mala idea.
Si la implementación es fácil de explicar, puede ser una buena idea.
Los espacios de nombres son una gran idea hon vamos a hacer más de esos!

Así que, aquí está mi opinión. Cada vez que encuentre un error, debe hacer algo para manejarlo, es decir, escribirlo en el archivo de registro u otra cosa. Al menos, te informa que solía haber un error.

 27
Author: Booster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 08:00:30

Debe usar al menos except Exception: para evitar capturar excepciones del sistema como SystemExit o KeyboardInterrupt. Aquí está enlace a los documentos.

En general, debe definir explícitamente las excepciones que desea capturar, para evitar la captura de excepciones no deseadas. Deberías saber qué excepciones ignoras .

 23
Author: Tupteq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 13:07:49

Primero, viola dos principios del Zen de Python :

  • Lo explícito es mejor que lo implícito
  • Los errores nunca deben pasar en silencio

Lo que significa, es que intencionalmente haces que tu error pase silenciosamente. Además, no sabe qué error ocurrió exactamente, porque except: pass atrapará cualquier excepción.

En segundo lugar, si tratamos de abstraernos del Zen de Pitón, y hablar en términos de cordura justa, usted debe sepa que usar except:passle deja sin conocimiento y control en su sistema. La regla general es plantear una excepción, si ocurre un error, y tomar las acciones apropiadas. Si no sabe de antemano qué acciones deberían ser, al menos registre el error en algún lugar (y mejor vuelva a plantear la excepción):

try:
    something
except:
    logger.exception('Something happened')

Pero, por lo general, si intentas atrapar alguna excepción, ¡probablemente estás haciendo algo mal!

 12
Author: Alexander Zhukov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-12 12:54:28

La construcción except:pass esencialmente silencia todas y cada una de las condiciones excepcionales que surgen mientras se ejecuta el código cubierto en el bloque try:.

Lo que hace que esta mala práctica es que por lo general no es lo que realmente quieres. Más a menudo, surge alguna condición específica que desea silenciar, y except:pass es demasiado un instrumento contundente. Hará el trabajo, pero también enmascarará otras condiciones de error que probablemente no haya anticipado, pero puede muy bien quiero tratar de otra manera.

Lo que hace que esto sea particularmente importante en Python es que por los modismos de este lenguaje, las excepciones no son necesariamente errores. A menudo se usan de esta manera, por supuesto, al igual que en la mayoría de los idiomas. Pero Python en particular los ha usado ocasionalmente para implementar una ruta de salida alternativa de algunas tareas de código que no es realmente parte del caso de ejecución normal, pero que aún se sabe que aparece de vez en cuando e incluso se puede esperar en la mayoría de los casos caso. SystemExit ya ha sido mencionado como un ejemplo antiguo, pero el ejemplo más común hoy en día puede ser StopIteration. El uso de excepciones de esta manera causó mucha controversia, especialmente cuando los iteradores y generadores se introdujeron por primera vez en Python, pero finalmente la idea prevaleció.

 11
Author: The Spooniest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 15:10:33

La razón #1 ya ha sido indicada - oculta errores que no esperabas.

(#2) - Hace que su código sea difícil de leer y entender para otros. Si detecta una excepción FileNotFoundException cuando está tratando de leer un archivo, entonces es bastante obvio para otro desarrollador qué funcionalidad debería tener el bloque 'catch'. Si no especifica una excepción, entonces necesita comentarios adicionales para explicar lo que debe hacer el bloque.

(#3) - demuestra programación perezosa. Si usa el genérico try/catch, indica que no comprende los posibles errores de tiempo de ejecución en su programa, o que no sabe qué excepciones son posibles en Python. Detectar un error específico muestra que comprende tanto el programa como el rango de errores que arroja Python. Es más probable que esto haga que otros desarrolladores y revisores de código confíen en su trabajo.

 11
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 02:25:47

Entonces, ¿qué salida produce este código?

fruits = [ 'apple', 'pear', 'carrot', 'banana' ]

found = False
try:
     for i in range(len(fruit)):
         if fruits[i] == 'apple':
             found = true
except:
     pass

if found:
    print "Found an apple"
else:
    print "No apples in list"

Ahora imagine la try-except block es cientos de líneas de llamadas a una jerarquía de objetos compleja, y se llama en medio del árbol de llamadas de un programa grande. Cuando el programa sale mal, ¿dónde empiezas a buscar?

 11
Author: Ian Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-06 10:27:25

En general, puede clasificar cualquier error / excepción en una de tres categorías :

  • Fatal : No es tu culpa, no puedes prevenirlos, no puedes recuperarte de ellos. Ciertamente no debe ignorarlos y continuar, y dejar su programa en un estado desconocido. Simplemente deje que el error termine su programa, no hay nada que pueda hacer.

  • Boneheaded : Su propia culpa, muy probablemente debido a un descuido, error o error de programación. Usted debería arreglar el error. Una vez más, ciertamente no debe ignorar y continuar.

  • Exógeno : Puede esperar estos errores en situaciones excepcionales, como archivo no encontrado o conexión terminada. Debe manejar explícitamente estos errores, y solo estos.

En todos los casos except: pass solo dejará su programa en un estado desconocido, donde puede causar más daño.

 10
Author: Daniel Pelsmaeker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 17:01:27

En pocas palabras, si se lanza una excepción o error, algo está mal. Puede que no sea algo muy malo, pero crear, lanzar y detectar errores y excepciones solo por el bien de usar declaraciones goto no es una buena idea, y rara vez se hace. el 99% de las veces, había un problema en alguna parte.

Hay que tratar los problemas. Al igual que en la vida, en la programación, si dejas los problemas en paz y tratas de ignorarlos, no se van por su cuenta un montón de tiempos; en cambio se hacen más grandes y se multiplican. Para evitar que un problema crezca en usted y golpee de nuevo más adelante en el camino, ya sea 1) eliminarlo y limpiar el desorden después, o 2) contenerlo y limpiar el desorden después.

Simplemente ignorar excepciones y errores y dejarlos así es una buena manera de experimentar fugas de memoria, conexiones de base de datos sobresalientes, bloqueos innecesarios en los permisos de archivos, etc.

En raras ocasiones, el problema es tan minúsculo, trivial, y-aparte de necesitar una oportunidad...catch block - autónomo, que realmente no hay ningún lío que limpiar después. Estas son las únicas ocasiones en las que esta mejor práctica no necesariamente se aplica. En mi experiencia, esto ha significado generalmente que lo que sea que el código está haciendo es básicamente mezquino y renunciable, y algo como intentos de reintento o mensajes especiales no vale la pena ni la complejidad ni sostener el hilo.

En mi empresa, la regla es casi siempre haz algo en un bloque catch, y si no haces nada, siempre debes colocar un comentario con una muy buena razón para no hacerlo. Nunca debe pasar o dejar un bloque de captura vacío cuando hay algo que hacer.

 5
Author: Panzercrisis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 23:30:34

En mi opinión los errores tienen una razón para aparecer, que mi sonido estúpido, pero esa es la forma en que es. Una buena programación solo genera errores cuando tienes que manejarlos. Además, como leí hace algún tiempo, "la Sentencia pass es una Sentencia que muestra que el código se insertará más tarde", por lo que si desea tener una sentencia except-vacía, siéntase libre de hacerlo, pero para un buen programa habrá una parte que falta. porque no manejas las cosas que deberías tener. Las excepciones que aparecen le dan la oportunidad de corregir datos de entrada o para cambiar su estructura de datos para que estas excepciones no vuelvan a ocurrir (pero en la mayoría de los casos (Network-exceptions, General input-exceptions) excepciones indican que las siguientes partes del programa no se ejecutarán bien. Por ejemplo, una excepción de red puede indicar una conexión de red rota y el programa no puede enviar/recibir datos en los siguientes pasos del programa.

Pero usar un bloque de paso para un solo bloque de exección es válido, porque todavía se diferencian entre los tipos de excepciones, así que si pones todos los bloques de excepción en uno, no está vacío:

try:
    #code here
except Error1:
    #exception handle1

except Error2:
    #exception handle2
#and so on

Se puede reescribir de esa manera:

try:
    #code here
except BaseException as e:
    if isinstance(e, Error1):
        #exception handle1

    elif isinstance(e, Error2):
        #exception handle2

    ...

    else:
        raise

Así que incluso varios bloques excepto con instrucciones de paso pueden resultar en código, cuya estructura maneja tipos especiales de excepciones.

 5
Author: Sirac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 00:02:46

Todos los comentarios presentados hasta ahora son válidos. Siempre que sea posible, debe especificar exactamente qué excepción desea ignorar. Siempre que sea posible, debe analizar qué causó la excepción, y solo ignorar lo que quería ignorar, y no el resto. Si la excepción hace que la aplicación se "bloquee espectacularmente", entonces que así sea, porque es mucho más importante saber lo inesperado que sucedió cuando sucedió, que ocultar que el problema alguna vez ocurrió.

Con todo lo dicho, no tome ninguna la práctica de la programación como algo primordial. Esto es estúpido. Siempre existe el momento y el lugar para hacer el bloque ignorar todas las excepciones.

Otro ejemplo de paramount idiota es el uso del operador goto. Cuando estaba en la escuela, nuestro profesor nos enseñó goto operador solo para mencionar que no lo usarás, NUNCA. No creas que la gente te dice que xyz nunca debe usarse y no puede haber un escenario cuando es útil. Siempre lo hay.

 4
Author: galets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-04 20:52:01

El manejo de errores es muy importante en la programación. Es necesario mostrar al usuario lo que salió mal. En muy pocos casos puede ignorar los errores. Esto es es muy mala práctica de programación.

 2
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-08 00:47:27