2009-12-06 18 views
11

Considere estas dos fragmentos:Inconsistencia de SyntaxError en Python?

try: 
    a+a=a 
except SyntaxError: 
    print "first exception caught" 

.

try: 
    eval("a+a=a") 
except SyntaxError: 
    print "second exception caught" 

En el segundo caso, la "segunda excepción .." declaración está impresa (excepción capturada), mientras que en el primero no lo es.

¿La primera excepción (llamémosla "SyntaxError1") es diferente de la segunda ("SyntaxError2")?

¿Hay alguna forma de detectar SyntaxError1 (lo que suprime los errores de tiempo de compilación)? Envolver grandes bloques de código en eval no es satisfactoria;)

+0

Suprimir errores en tiempo de compilación ???? ¿Qué puede significar eso? ¿Puede proporcionar alguna definición para el caso de uso en el que desea que se analice el código no dispersable? ¿Qué se supone que va a pasar? ¿Qué tan malo puede ser el código y aún así ser "analizado"? ¿De qué estás hablando? –

+0

La pregunta se centró principalmente en la posible inconsistencia de SyntaxErrors arrojados en diferentes situaciones. Alex explicó que no hay inconsistencia en absoluto, y que todo el comportamiento descrito consiste en los mecanismos del compilador de construir una estructura de nivel superior de try/except. Un archivo de desarrollador confiable * .py podría cargar un caso de uso probable con alguna funcionalidad (¿un simple sistema de complemento?), Con la necesidad de validar su sintaxis inmediatamente después de la carga. – gorsky

Respuesta

15

En el primer caso, la excepción se eleva por el compilador, que se ejecuta antes la estructura try/except aun existe (ya que es el propio compilador que establecerá justo después del análisis). En el segundo caso, el compilador se ejecuta dos veces, y la excepción se genera cuando el compilador se ejecuta como parte de eval, después de la primera ejecución del compilador ya ha configurado el try/except.

Por lo tanto, para interceptar errores de sintaxis, de una manera u otra, usted tiene que arreglar para que el compilador ejecuta dos veces - eval es una manera, explícita compile función incorporada llama a otro, import queda muy cerca (después de escribir el código a otro archivo), exec y execfile otras posibilidades todavía. Pero como sea que lo haga, los errores de sintaxis pueden capturarse solo después de que el compilador se haya ejecutado por primera vez para configurar los bloques try/except que necesita.

+0

No conocía la variedad de soluciones. Especialmente uno con importación explícita resuelve mi maletín oculto elegantemente. Muchas gracias, Alex! – gorsky

2

Respuesta corta: No.

Los errores de sintaxis se producen cuando se analiza el código, que para el código Python normal es antes de que se ejecute el código, - el código no se está ejecutando dentro del bloque try/except ya que el código no es ejecutando, punto

Sin embargo, cuando evalúa o ejecuta algún código, lo analiza en tiempo de ejecución para que pueda detectar la excepción.

Cuestiones relacionadas