[Python] - verifica connessione e traceback

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 377
Iscrizione: mercoledì 30 dicembre 2009, 17:01

[Python] - verifica connessione e traceback

Messaggio da Lapa »

Buonasera,
il mio listato viene eseguito ogni 15 min. su Raspberry.
Una parte di comandi agiscono in locale, altri hanno bisogno di connessione Internet.
A me piacerebbe che in mancanza di connessione lo script non s'interrompesse in modo che i comandi che agiscono in locale vengano portati a termine.
Pertanto ho usato questo codice di verifica connessione prima delle chiamate che agiscono via Internet.

Codice: Seleziona tutto

try:
    from urllib.request import urlopen
    try:
        with urlopen('https://www.google.com') as up:
            print('Connessione attiva, verificato con try')
            a=23*78
            
            print("Dopo la verifica connessione esegue il comando successivo\n il prodotto tra 23 e 78 è uguale a ",a)
            errore#se c'è un errore non mi fa il traceback quindi non posso raccogliere gli errori in un file 
    except BaseException as ex:
        print('Connessione non attiva, verificato con try')


Funziona ma non produce il traceback
A me piacerebbe controllare se ci sono state delle disconnessioni per cui le funzione che utilizzano connessioni vengono saltate.
A questo scopo ho usato tale codice ma non funziona, in quanto appunto il precedente non produce traceback dopo la verifica della connessione anche in presenza di un errore palese (errore appunto non l'ho definito prima).
Come posso risolvere?

Codice: Seleziona tutto

import traceback
from datetime import datetime
try:
    from urllib.request import urlopen
    try:
        with urlopen('https://www.google.com') as up:
            print('Connessione attiva, verificato con try')
            a=23*78
            
            print("Dopo la verifica connessione esegue il comando successivo\n il prodotto tra 23 e 78 è uguale a ",a)
            errore#se c'è un errore non mi fa il traceback quindi non posso raccogliere gli errori in un file 
    except BaseException as ex:
        print('Connessione non attiva, verificato con try')

except:
    ora=datetime.now()
    ora=ora.strftime("%H:%M:%S")
    print (ora)
    filename=ora+"errorInfo.txt"
    print(filename)
    #e lo inserisce in una specifica cartella "errori"
    errorFile=open ('/home/Pasquale/Documenti/PythonEsercizi/EccezioniDebug/errori'+str(filename) ,'w')
    errorFile.write(traceback.format_exc())
    errorFile.close()
    print('Le informazioni di traceback sono state scritte nel file ',filename)


Ringrazio anticipatamente

Saluti

LaPa
Ultima modifica di Lapa il martedì 18 aprile 2023, 9:06, modificato 1 volta in totale.
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 852
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

Re: [Python] - verifica connessione e traceback

Messaggio da TommyB1992 »

Ti consiglierei di usare l'exception adatta (che non so quale sia ma se togli il try/except te lo segnalerà) e incollare quella al posto di BaseException, così catturarà solo l'effettiva disconnessione e potrai leggere altri tipi d'errori.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] - verifica connessione e traceback

Messaggio da nuzzopippo »

Ciao @LaPa
Lapa ha scritto:
lunedì 17 aprile 2023, 22:15
A me piacerebbe che in mancanza di connessione lo script non s'interrompesse in modo che i comandi che agiscono in locale vengano portati a termine.
Pertanto ho usato questo codice di verifica connessione prima delle chiamate che agiscono via Internet.
...
Funziona ma non produce il traceback
A me piacerebbe controllare se ci sono state delle disconnessioni per cui le funzione che utilizzano connessioni vengono saltate.
A questo scopo ho usato ...
Mi sembra di ricordare che proprio con Te, tempo fa, si è discusso estesamente in merito a segnalazione di errori e traceback, comunque il secondo stralcio di codice da Te postato non può darti il traceback per il try/except annidato, prova a scriverlo in questo modo:

Codice: Seleziona tutto

from datetime import datetime
import traceback
from urllib.request import urlopen

f_log = 'mylogs.log'

passed = True
try:
    with urlopen('https://127.0.0.1:80') as up:
        print('Connessione attiva')
except OSError as e:
    passed = False
    tmp = datetime.now()
    msg = tmp.strftime('%Y/%m/%d %H:%M:%S') + ' - Errore connesione :\n'
    msg += traceback.format_exc()
    try:
        with open(f_log, 'a') as f:
            f.write(msg)
    except OSError as e:
        print('Errore di accesso al file di log:', repr(e))
        print(msg)

if not passed: print('Connessione non attiva')

# continuare, quindi, con gli altri processi
Ovviamente è una indicazione schematica, gli errori di urlopen sono un sub-classamento di OSError, con lo schema sopra se la Tua connessione fallirà i processi continueranno comunque, Te lo confermerà in "print" che riceverai

Codice: Seleziona tutto

NzP:~$ python3 per_errori.py
Connessione non attiva
NzP:~$ 
mentre il traceback ti verrà "appeso" nel file di log, che sarà sempre lo stesso e ti permetterà di verificare quanto frequentemente nel tempo avvengono errori di connessione e darà traccia per risalire ai perché

Codice: Seleziona tutto

Traceback (most recent call last):
  File "/home/nuzzopippo/src/posts/la_pa/per_errori.py", line 9, in <module>
    with urlopen('https://127.0.0.1:80') as up:
  File "/usr/lib/python3.10/urllib/request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.10/urllib/request.py", line 519, in open
    response = self._open(req, data)
  File "/usr/lib/python3.10/urllib/request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/usr/lib/python3.10/urllib/request.py", line 496, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.10/urllib/request.py", line 1391, in https_open
    return self.do_open(http.client.HTTPSConnection, req,
  File "/usr/lib/python3.10/urllib/request.py", line 1351, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
... ovviamente, sul mio localhost non c'è alcun server http ;)
Fatti non foste a viver come bruti ...
red.rollers00
Prode Principiante
Messaggi: 85
Iscrizione: sabato 5 gennaio 2008, 17:57

Re: [Python] - verifica connessione e traceback

Messaggio da red.rollers00 »

Premetto non ho provato ne studiato a fondo il tuo codice ma la butto lì magari prova. :)

Se vuoi puoi chiamare tu l'eccezione con l'istruzione raise: https://docs.python.org/3.9/reference/s ... -statement
Quì invece trovi il modo giusto di gestire le eccezioni un solo try e quanti except vuoi: https://docs.python.org/3.9/tutorial/er ... exceptions
Questo è riferito alla python3.9 guarda la tua versione e cerca la pagina giusta.
:ciao:
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti