2012-09-11 16 views
10

que tienen el código Python:Python bloque try no coge os.system excepciones

import os 
try: 
    os.system('wrongcommand') 
except: 
    print("command does not work") 

La impresora de código:

wrongcommand: command not found 

En lugar de command does not work. ¿Alguien sabe por qué no está imprimiendo mi mensaje de error?

Respuesta

18

Si quieren tener una excepción iniciada cuando no existe el comando, se debe utilizar subprocess:

import subprocess 
try: 
    subprocess.call(['wrongcommand']) 
except OSError: 
    print ('wrongcommand does not exist') 

Ahora que lo pienso de ella, que es mejor usar subprocess en lugar de todos modos ... os.system

+0

gracias, esto es justo lo que necesitaba. – Cinder

1

wrongcommand: command not found es la salida de la carcasa os.system está utilizando para invocar el comando. os.system no lanzó una excepción

EDIT: editados por parte de copiar y pegar el comentario de mgilson

+0

gracias, pero ¿cómo se captura en Python? ¿es posible? – Cinder

+1

Sí, pero no usando 'os.system()'. Esta es una de las razones por las que debe usar el módulo 'subproceso', como se indica en la respuesta de @ mgilson. –

+0

Más específicamente, 'wrongcommand: command not found' es la salida de * shell * que' os.system' está usando para invocar el comando.(un shell diferente con una "RUTA" diferente podría encontrar el comando). – mgilson

3

Hay dos problemas en el fragmento de código. En primer lugar, nunca solo haga try: ... except:, siempre sea específico sobre qué excepción desea manejar. De lo contrario, su programa simplemente se traga cualquier tipo de error, también aquellos que no espera. En la mayoría de los casos, esto conducirá a un comportamiento inesperado en algún otro momento durante el tiempo de ejecución.

Además, las llamadas os.system() deberían ser reemplazadas la mayoría de las veces por sus contrapartes del módulo subprocess.

para ver lo que va mal, dejar de lado el try/excepto bloque y realmente se ven en el rastreo/excepción. Como han señalado otros, observará que no hay excepción en su caso, por lo que su cadena personalizada no se imprime.

En pocas palabras: pensar en el cual las excepciones específicas pueden ocurrir en su bloque de código. Piensa mucho acerca de cuál de ellos esperas que suceda por ciertas razones y maneja esos adecuadamente. No manejes aquellos que no esperas.

9

Debido os.system() indica un fallo a través del código de salida del método

  • valor de retorno = 0 -> todo bien
  • valor de retorno = 0 -> algún error

El código de salida del comando llamado se pasa directamente a Python.

Existe documentación que le dice que os.system() elevaría una excepcion en caso de fallo. os.system() simplemente llama a la llamada underlaying system() del sistema operativo y devuelve su valor de retorno.

Lea atentamente la documentación de os.system() .

Cuestiones relacionadas