with tutorial programming para language framework espaƱol djangoproject desde cero applications python python-idle

tutorial - framework django python



Salir con gracia si el archivo no existe (2)

Tengo el siguiente script en Python 3.2.3:

try: file = open(''file.txt'', ''r'') except IOError: print(''There was an error opening the file!'') sys.exit() #more code that is relevant only if the file exists

¿Cómo salgo correctamente si el archivo no existe (o simplemente hay un error al abrirlo)?

Puedo usar exit() , pero eso abre un panel de diálogo que pregunta si quiero finalizar la aplicación.

Puedo usar sys.exit() , pero eso genera una excepción de SystemExit que no se ve muy bien en la salida. yo obtengo

Traceback (most recent call last): File "file", line 19, in <module> sys.exit() SystemExit

Puedo usar os.exit() , pero eso mata a Python en el nivel C, sin ninguna limpieza que pueda estar realizando.

Puedo usar una variable booleana y envolver todo el código subsiguiente si ... pero eso es feo, y este no es el único control que estoy realizando. Así que me gustaría seis ifs anidados ...

Solo quiero imprimir el mensaje ''Hubo un error ...'' y salir. Estoy trabajando en IDLE.


Esta es una manera muy elegante de hacerlo. El rastreo de SystemExit no se imprimirá fuera de IDLE. Opcionalmente, puede usar sys.exit(1) para indicar al shell que el script terminó con un error.

Alternativamente, puede hacer esto en su función "principal" y usar la función de return para finalizar la aplicación:

def main(): try: file = open(''file.txt'', ''r'') except IOError: print(''There was an error opening the file!'') return # More code... if __name__ == ''__main__'': main()

Aquí, el código de ejecución principal de la aplicación se encapsula en una función única llamada "main", y luego se ejecuta solo si el script es ejecutado directamente por el intérprete de Python, o en otras palabras, si el script no lo está importando otro script. (La variable __name__ se establece en "__main__" si la secuencia de comandos se ejecuta directamente desde la línea de comandos. De lo contrario, se configurará con el nombre del módulo.)

Esto tiene la ventaja de reunir toda la lógica de ejecución del script en una sola función, hacer que su script sea más limpio y le permite salir de forma limpia del script con la instrucción de return , como en la mayoría de los idiomas compilados.


Usar sys.exit () está bien. Si está preocupado por la salida, siempre puede agregar un bloque adicional try / except dentro de la sección de manejo de errores para capturar el SystemExit y evitar que se dirija a la salida de la consola.

try: file = open(''file.txt'', ''r'') except IOError: try: print(''There was an error opening the file!'') sys.exit() except SystemExit: #some code here that won''t impact on anything