This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 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
  Responder
#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...
  Responder
#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.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
Música CONSULTA Que monitor que useis,o usado recomendaríais para diseño gráfico y edición de vídeo? erjavi_zgz 0 257 11-08-2022, 06:27 PM
Último mensaje: erjavi_zgz
  CONSULTA Por qué el idioma del teclado del windows no escribe correctacmente el simbolo "@"? erjavi_zgz 0 188 22-06-2022, 11:38 PM
Último mensaje: erjavi_zgz
Pregunta Crear panel web para ejecutar scripts (bash/python) Electromecánico 5 3,313 08-05-2018, 08:38 PM
Último mensaje: Electromecánico
  Alguien que "PILOTE" Python jusalyso 13 4,595 31-10-2013, 01:29 PM
Último mensaje: jusalyso