tipos inicio fin excepciones etiquetas ejemplos diferentes php python exception programming-languages

excepciones - inicio y fin en php



¿La gestión de excepciones de Python es más eficiente que PHP y/u otros lenguajes? (6)

Hay una excepción específica que solo se debe usar en el flujo de ejecución normal: StopIteration . Esto me implica que el creador de Python no cree que la sobrecarga de excepción esté fuera de lugar.

Si esto se debe a que el manejo de excepciones es muy eficiente o el resto del lenguaje es lento en comparación, es otra pregunta ...

Lo he perforado en mi cabeza que (al menos en PHP) es badbadmojo usar bloques try... catch para controlar el flujo. Lo que aprendí es usarlos solo para manejar errores inesperados , no para determinar el flujo lógico del programa, porque catch bloques de catch son costosos.

Ahora que estoy aprendiendo python, veo muchas excepciones en todas partes y el principio de EAFP . ¿Esto significa que python es más eficiente en el manejo de excepciones, por lo que no tengo que preocuparme tanto por el control de flujo, o el principio sigue vigente? Si no, ¿es PHP la excepción de la norma (en comparación con otros idiomas), o es Python?


He leído un poco más y me he dado cuenta de otra cosa importante que nadie ha mencionado todavía: en Python, no hay distinción entre Errores y Excepciones. Sabía esto, pero no creo haber comprendido el significado hasta ahora.

En PHP, puede envolver $page->GetContent(); en el try...catch bloques que quieras, pero si $page no es un objeto, tu aplicación seguirá deteniéndose con el error fatal resultante. Por lo tanto, en PHP (y en cualquier otro idioma donde no se puedan detectar errores), necesita un cierto nivel de LBYL.

Python básicamente dice: "eso es estúpido, debería poder atraparlos". Solo intente hacer lo que necesita hacer y lidiar con cualquier caída en el bloque de except .

Aquí hay un gran artículo sobre manejo de excepciones que encontré.


Históricamente, en idiomas como C ++, las excepciones han sido muy lentas en comparación con otras formas de control de flujo en el mismo idioma .

En C ++, hay dos cosas en el trabajo:

  • Lanzar una excepción es muy complejo. La pila debe ser desenrollada, y hacerlo en código nativo es mucho más difícil que en un lenguaje de alto nivel basado en máquinas virtuales.
  • El control de flujo regular y directo es extremadamente rápido. Es código nativo; una rama es un par de instrucciones, donde una excepción que hace retroceder la pila invoca un algoritmo complejo (buscar datos de pila en una tabla grande, posiblemente comprimida, etc.).

Esta disparidad en el rendimiento llevó a la sabiduría general detrás de las excepciones: solo lo hace para cosas inusuales, por lo que solo se usa donde es más beneficioso y no donde afectará el rendimiento.

Esto no se aplica a los idiomas de alto nivel. Esto también es por dos razones:

  • Hacer retroceder la pila es mucho, mucho más simple. La pila es muy fácil de examinar; no necesita tablas mágicas para saber a qué distancia se debe hacer retroceder la pila y qué objetos se construyen en un momento dado.
  • El flujo regular del programa es inherentemente más lento. En un lenguaje basado en VM, para empezar, todo requiere más trabajo.

Las excepciones aún no son gratuitas, pero la disparidad ya no es algo de lo que preocuparse tanto. Esto significa que la sabiduría general formada en C ++ está mal aplicada aquí. Las excepciones se utilizan regularmente en el flujo normal del programa.

De hecho, están incorporados en el lenguaje, en construcciones que usas todo el tiempo. Cada vez que usa un iterador, cada for x in xrange(1000) , se utiliza una excepción StopIteration para finalizar el ciclo.

Elija excepciones o control de flujo lineal en Python en función de lo que tenga más sentido. No elija según el rendimiento, a menos que esté realmente en un bucle interno donde el rendimiento es importante; En ese caso, como siempre, haga un perfil y averigüe si realmente importa.

(No puedo hablar por PHP)


No creo que la EAFP fomente el uso de excepciones para el control de flujo. Más bien, nos dice que no debemos molestarnos en verificar la existencia de una clave en particular en un diccionario o propiedad de un objeto antes de hacer referencia a él.

Las excepciones de lanzamiento como una alternativa a las sentencias if o tener sentencias while correctas o en lugar de usar break o continue dentro de un bucle no se incluyen en esa categoría. Eso es un programa perezoso, propenso a errores y debe evitarse.


Para contestar la pregunta: si. Las excepciones de Python son baratas. Una prueba de si aún es más barata, así que sí, solo debe usar excepciones para situaciones "inesperadas", ya que si espera que el código falle la mayoría de las veces, verifique antes de hacerlo. Dado que el if-check evitará también el intento real, así como el aumento y captura de la excepción, será mucho más rápido en una situación que falla. (A menos que, por supuesto, la prueba en sí sea costosa).

Pero no tiene sentido evitar excepciones como tales. Python no se arrastrará a un rastreo porque se detectan muchas excepciones.

Y como es habitual: la optimización sin perfil es prematura.