Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Por qué me sale del try? [PYTHON]
#1
Buenas a tod@s:

Estoy mejorando un script que es la suma de dos scripts en una. Los dos, por separado me funcionan, pero al juntarlos hay algo que me falla. Os adjunto el script:

Código:
#!/usr/bin/env python
#RASPBERRY

import socket
import os
import time





data = (time.strftime("%d_%m_%y"))
hora = (time.strftime("%H:%M:%S"))

def IsInternet():
    testConn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        testConn.connect(('192.168.1.1', 80))


        testConn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        try:
            testConn.connect(('8.8.8.8', 80))
            os.chdir("/home/pi/Desktop/Scripts/Informes")
            os.system("speedtest >> resultat.txt")
            download = os.system("grep '^D' resultat.txt")
            upload = os.system("grep '^U' resultat.txt")
            print ("Resultados obtenidos")
            print (download)
            print (upload)
            os.chdir ("/home/pi/Desktop/Scripts/Informes")
            archi=open('informe.txt', 'a')       #Grabem els resultats obtinguts en el document
            archi.write(data+' '+hora+'\n')
            archi.write(' '+'\n')
            archi.write(upload+'\n')
            archi.write(' '+'\n')
            archi.write(download+'\n')
            archi.write(' '+'\n')
            archi.write(' '+'\n')
            archi.write(' '+'\n')
            archi.close()
            testConn.close()
            os.system("rm resultat.txt")

        except:
            testConn.close()
            os.chdir("/home/pi/Desktop/Scripts/Informes")
            archi=open('informe.txt', 'a')       #Grabem els resultats obtinguts en el document
            archi.write(data+' '+hora+'\n')
            archi.write(' '+'\n')
            archi.write('No se ha podido realizar la prueba debido a que no hay conexion con el ISP\n')
            archi.write(' '+'\n')
            archi.write(' '+'\n')
            archi.write(' '+'\n')
            archi.close()
            testConn.close()

    except:
        os.chdir("/home/pi/Desktop/Scripts/Informes")
        archi=open('informe.txt', 'a')       #Grabem els resultats obtinguts en el document
        archi.write(data+' '+hora+'\n')
        archi.write(' '+'\n')
        archi.write('No se ha podido realizar la prueba debido a que el router esta apagado\n')
        archi.write(' '+'\n')
        archi.write(' '+'\n')
        archi.write(' '+'\n')
        archi.close()
        testConn.close()






IsInternet()


El caso es que con condiciones normales, tendría que entrar en el primer try y escribir los datos obtenidos. Sin embargo me va al primer except y escribe en el documentos de informes que no hay conexión con el exterior, a que es debido? 

No me sale ningún comentario de error ni nada.

He hecho la prueba de coger el código y meterlo en un script de prueba para ver qué salida tenía y si me daba algun error:

Código:
#!/usr/bin/env python

import os


os.system("speedtest >> resultat.txt")
download = os.system("grep '^D' resultat.txt")
upload = os.system("grep '^U' resultat.txt")

print (upload)
print (download)

os.system("rm resultat.txt")

Y la salida en lugar de darme un upload y otro download me salen varias lineas, no se porqué, ya que la prueba solo te saca una línea por cada uno:

Código:
Download: 30.33 Mbit/s
Download: 22.07 Mbit/s
Upload: 30.13 Mbit/s
Upload: 29.51 Mbit/s
0
0


Muchas gracias
Citar
#2
Nunca se debería usar una estructura except sin saber que excepción ha saltado.

Código:
try:
   x = unicode(value, "ascii")
except UnicodeError:
   value = unicode(value, "utf-8")
else:
   # value was valid ASCII data
   pass
En este código solo se captura el error si es del tipo UnicodeError, pero tú al omitirlo, capturas TOOOODOO lo que pueda suceder y eso es malo.
En la ayuda de socket.socket indica: "All errors raise exceptions. The normal exceptions for invalid argument types and out-of-memory conditions can be raised; errors related to socket or address semantics raise the error "socket.error"

Entiendo que deberías capturar el error "socket.error", pero quizás salte un "out-of-memory" o "invalid argument" que tú lo interpretas como que no hay internet..., también hay otros errores que pueden saltar como socket.herror, socket.timeout (que puede ocurrir facilmente),  etc.

Siento que no sea una respuesta directa, pero lo primero sería poner en el except:

Código:
except Exception as exception:
   print type(exception).__name__
   print exception.__class__.__name__

Con eso ya sabes qué tipo de error se ha producido mientras pruebas el script, a partir de ahí, ya puedes capturar esa excepción en concreto y tratarla.

Edito: No te salta ningún error porque usas "try-except", si quitas ambos try-except, te saltará el error, la clase de error y el mensaje de error.

Por si no quieres quitar líneas, quitar sangrado del código, etc, creo esto funcionaba:
Código:
instruccion1
try:
  instrucción
except:
  print "upss... algo inesperado pasó"
  raise

ese "raise" lo que hace es levantar la misma excepción que se ha producido y capturado en el except, o sea, como si no hubieras puesto ningún "try-except".

leído aquí: https://docs.python.org/2.7/tutorial/errors.html

Saludos!
Ulticampy V2: fundiendo plástico sin descanso...
Citar
#3
Buenas a tod@s:

Muchas gracias Sonrisa

Con lo que comentaste vi el error y pude hacer que no saliese del try sin motivo.
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
Pregunta Crear panel web para ejecutar scripts (bash/python) Electromecánico 5 464 08-05-2018, 08:38 PM
Último mensaje: Electromecánico
  Alguien que "PILOTE" Python jusalyso 13 2,211 31-10-2013, 01:29 PM
Último mensaje: jusalyso