import ftplib
import urllib2
import os
import logging
logger = logging.getLogger('ftpuploader')
hdlr = logging.FileHandler('ftplog.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
FTPADDR = "some ftp address"
def upload_to_ftp(con, filepath):
try:
f = open(filepath,'rb') # file to send
con.storbinary('STOR '+ filepath, f) # Send the file
f.close() # Close file and FTP
logger.info('File successfully uploaded to '+ FTPADDR)
except, e:
logger.error('Failed to upload to ftp: '+ str(e))
Wydaje się, że to nie działa, pojawia się błąd składniowy, jaki jest prawidłowy sposób rejestrowania wszelkiego rodzaju wyjątków w pliku
,
późniejexcept
.,
późniejexcept
, otrzymaszglobal name 'e' is not defined
, co nie jest dużo lepsze niż zła składnia.except Exception as e
lubexcept Exception, e
, w zależności od wersji Python.Odpowiedzi:
Musisz zdefiniować typ wyjątku, który chcesz złapać. Napisz więc
except Exception, e:
zamiastexcept, e:
ogólnego wyjątku (który i tak zostanie zarejestrowany).Inną możliwością jest napisanie w ten sposób całego kodu try / oprócz:
w Pythonie 3.xi współczesnych wersjach Pythona 2.x
except Exception as e
zamiastexcept Exception, e
:źródło
logger.exception(e)
Zamiast tego można użyć wyjątku dla rejestrowania wyjątku . Rejestruje wyjątek za pomocą traceback na tym samymlogging.ERROR
poziomie.except Exception, e:
zgłasza mi błąd składniowy w Pythonie 3. Czy jest to oczekiwane?except Exception as e:
Składnia nie jest już obsługiwana w Pythonie 3. Zamiast tego użyj następujących.
źródło
logging.error('foo %s', str(e))
zawsze będzie konwertowanae
na ciąg. Aby osiągnąć to, czego oczekujesz, użyłbyślogging.error('foo %s', e)
- pozwalając w ten sposób ramce rejestrowania wykonać (lub nie) konwersję.logger.exception(e)
Zamiast tego można użyć wyjątku dla rejestrowania wyjątku . Rejestruje wyjątek za pomocą traceback na tym samymlogging.ERROR
poziomie.except BaseException
iexcept Exception
nie są na tym samym poziomie.except Exception
działa w Pythonie 3, aleKeyboardInterrupt
na przykład nie wyłapuje (co może być bardzo wygodne, jeśli chcesz mieć możliwość przerwania kodu!), aleBaseException
przechwytuje każdy wyjątek. Zobacz ten link, aby uzyskać hierarchię wyjątków.Aktualizacja tego do czegoś prostszego dla programu rejestrującego (działa zarówno dla Pythona 2, jak i 3). Nie potrzebujesz modułu śledzenia.
To jest teraz stary sposób (choć nadal działa):
exc_value to komunikat o błędzie.
źródło
W niektórych przypadkach można użyć e.message lub e.messages .. Ale to nie działa we wszystkich przypadkach. W każdym razie bardziej bezpieczne jest użycie str (e)
źródło
except Exception as e
ie
toIOError
, można uzyskaće.errno
,e.filename
ie.strerror
, ale najwyraźniej nie mae.message
(przynajmniej w Pythonie 2.7.12). Jeśli chcesz uchwycić komunikat o błędzie, użyjstr(e)
, jak w innych odpowiedziach.Jeśli chcesz mieć klasę błędu, komunikat o błędzie i dane śledzenia stosu (lub niektóre z nich), użyj
sys.exec_info()
.Minimalny działający kod z pewnym formatowaniem:
Co daje następujące dane wyjściowe:
Funkcja sys.exc_info () podaje szczegółowe informacje na temat ostatniego wyjątku. Zwraca krotkę
(type, value, traceback)
.traceback
jest instancją obiektu traceback. Możesz sformatować ślad za pomocą podanych metod. Więcej można znaleźć w dokumentacji śledzenia .źródło
e.__class__.__name__
może również zwrócić klasę wyjątków.Możesz użyć
logger.exception("msg")
do rejestrowania wyjątku z funkcją śledzenia:źródło
e.msg
jest ciągiem reprezentującymException
klasę.logger.exception(e)
.Po Pythonie 3.6 możesz użyć sformatowanego ciągu literałów. To jest miłe! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
źródło
Możesz spróbować jawnie określić typ wyjątku BaseException. Będzie to jednak wychwytywać tylko pochodne wyjątku BaseException. Chociaż obejmuje to wszystkie wyjątki dostarczone w ramach implementacji, możliwe jest również podniesienie dowolnych klas starego stylu.
źródło
Użyj str (ex), aby wydrukować wykonanie
źródło
dla przyszłych walczących, w Pythonie 3.8.2 (i może kilka wcześniejszych wersjach), składnia jest następująca
źródło
Używając
str(e)
lubrepr(e)
do reprezentowania wyjątku, nie otrzymasz rzeczywistego śladu stosu, więc nie jest pomocne ustalenie, gdzie jest wyjątek.Po przeczytaniu innych odpowiedzi i dokumentacji pakietu rejestrowania, następujące dwa sposoby świetnie sprawdzają się, aby wydrukować rzeczywiste dane śledzenia stosu w celu łatwiejszego debugowania:
użyj
logger.debug()
z parametremexc_info
posługiwać się
logger.exception()
lub możemy bezpośrednio użyć
logger.exception()
do wydrukowania wyjątku.źródło