захват сообщений об исключениях python
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))
Это, кажется, не работает, я получаю синтаксическую ошибку, каков правильный способ сделать это для регистрации всех видов исключений в файле
9 ответов:
вы должны определить, какой тип исключения вы хотите поймать. Так что пишите
except Exception, e:вместоexcept, e:для общего исключения (которое будет зарегистрировано в любом случае).другая возможность-написать всю вашу попытку / кроме кода таким образом:
try: with open(filepath,'rb') as f: con.storbinary('STOR '+ filepath, f) logger.info('File successfully uploaded to '+ FTPADDR) except Exception, e: logger.error('Failed to upload to ftp: '+ str(e))в Python 3.x и современные версии Python 2.X использование
except Exception as eвместоexcept Exception, e:try: with open(filepath,'rb') as f: con.storbinary('STOR '+ filepath, f) logger.info('File successfully uploaded to '+ FTPADDR) except Exception as e: logger.error('Failed to upload to ftp: '+ str(e))
синтаксис больше не поддерживается в python 3. Вместо этого используйте следующее.
try: do_something() except BaseException as e: logger.error('Failed to do something: ' + str(e))
обновление этого до чего-то более простого для logger (работает как для python 2, так и для 3). Вам не нужен модуль обратной трассировки.
import logging logger = logging.Logger('catch_all') def catchEverythingInLog(): try: ... do something ... except Exception as e: logger.error(e, exc_info=True) ... exception handling ...Это теперь старый способ (хотя все еще работает):
import sys, traceback def catchEverything(): try: ... some operation(s) ... except: exc_type, exc_value, exc_traceback = sys.exc_info() ... exception handling ...exc_value-это сообщение об ошибке.
есть некоторые случаи, когда вы можете использовать e. сообщение или Эл.сообщения.. Но это работает не во всех случаях. В любом случае, более безопасным является использование str (e)
try: ... except Exception as e: print(e.message)
можно использовать
logger.exception("msg")для регистрации исключения с обратной трассировкой:try: #your code except Exception as e: logger.exception('Failed: ' + str(e))
можно попробовать явно указать тип BaseException. Однако это будет ловить только производные BaseException. Хотя это включает в себя все исключения, предоставляемые реализацией, также возможно создание произвольных классов старого стиля.
try: do_something() except BaseException, e: logger.error('Failed to do something: ' + str(e))
Если вам нужен класс ошибок, сообщение об ошибке и трассировка стека (или любой из них), используйте
sys.exec_info().минимальный рабочий код с некоторым форматированием,
import sys import traceback try: ans = 1/0 except BaseException as ex: # Get current system exception ex_type, ex_value, ex_traceback = sys.exc_info() # Extract unformatter stack traces as tuples trace_back = traceback.extract_tb(ex_traceback) # Format stacktrace stack_trace = list() for trace in trace_back: stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3])) print("Exception type : %s " % ex_type.__name__) print("Exception message : %s" %ex_value) print("Stack trace : %s" %stack_trace)который выдаст следующий результат,
Exception type : ZeroDivisionError Exception message : division by zero Stack trace : ['File : .\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']это дает вам сведения об исключении о последнем исключении. Он возвращает кортеж. Ниже приведены значения кортежа!--3-->.
трассировки-это экземпляр объекта трассировки. Трассировку можно отформатировать с помощью предоставленных методов. Больше можно найти от документация отладочные
после python 3.6 можно использовать форматированный строковый литерал. Это здорово! (https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498)
try ... except Exception as e: logger.error(f"Failed to upload to ftp: {e}")
Comments