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))
Кажется, это не работает, я получаю синтаксическую ошибку, как правильно сделать это для записи всех видов исключений в файл
,
послеexcept
.,
послеexcept
, вы получитеglobal name 'e' is not defined
, что не намного лучше, чем неправильный синтаксис.except Exception as e
илиexcept Exception, e
, в зависимости от версии Python.Ответы:
Вы должны определить, какой тип исключения вы хотите поймать. Так что пишите
except Exception, e:
вместоexcept, e:
общего исключения (оно все равно будет записано).Другая возможность - написать весь код try / кроме этого:
в Python 3.x и современных версиях Python 2.x
except Exception as e
вместоexcept Exception, e
:источник
logger.exception(e)
вместо этого. Он будет регистрировать исключение с помощью traceback на том жеlogging.ERROR
уровне.except Exception, e:
выдает синтаксическую ошибку мне в python 3. Это ожидается?except Exception as e:
Синтаксис больше не поддерживается в Python 3. Вместо этого используйте следующее.
источник
logging.error('foo %s', str(e))
всегда будет преобразованаe
в строку. Чтобы достичь того, что вы хотите, вы бы использовалиlogging.error('foo %s', e)
- тем самым позволяя каркасу ведения журнала делать (или не делать) преобразование.logger.exception(e)
вместо этого. Он будет регистрировать исключение с помощью traceback на том жеlogging.ERROR
уровне.except BaseException
иexcept Exception
не на одном уровне.except Exception
работает в Python3, но, к примеру, он не перехватитKeyboardInterrupt
(что может быть очень удобно, если вы хотите прервать ваш код!), тогда какBaseException
перехватывает любое исключение. Смотрите эту ссылку для иерархии исключений.Обновление этого до чего-то более простого для регистратора (работает как для Python 2 и 3). Вам не нужен модуль трассировки.
Это теперь старый способ (хотя все еще работает):
exc_value - это сообщение об ошибке.
источник
В некоторых случаях вы можете использовать e.message или e.messages . Но это работает не во всех случаях. В любом случае, более безопасно использовать str (e)
источник
except Exception as e
, иe
этоIOError
, вы получитеe.errno
,e.filename
иe.strerror
, но , видимо , нетe.message
(по крайней мере , в Python 2.7.12). Если вы хотите перехватить сообщение об ошибке, используйтеstr(e)
, как в других ответах.Если вам нужен класс ошибок, сообщение об ошибке и трассировка стека (или некоторые из них), используйте
sys.exec_info()
.Минимальный рабочий код с некоторым форматированием:
Что дает следующий вывод:
Функция sys.exc_info () предоставляет вам информацию о самом последнем исключении. Она возвращает кортеж
(type, value, traceback)
.traceback
является экземпляром объекта трассировки. Вы можете отформатировать трассировку с помощью предоставленных методов. Больше можно найти в документации по трассировке .источник
e.__class__.__name__
может также вернуть класс исключения.Вы можете использовать
logger.exception("msg")
для регистрации исключений с помощью traceback:источник
e.msg
это строковое представлениеException
класса.logger.exception(e)
.После Python 3.6 вы можете использовать форматированный строковый литерал. Это аккуратно! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
источник
Вы можете попытаться указать тип BaseException явно. Тем не менее, это будет ловить только производные от BaseException. Хотя это включает в себя все предоставляемые реализацией исключения, возможно также вызвать произвольные классы старого стиля.
источник
Используйте str (ex) для печати execption
источник
для будущих борцов, в Python 3.8.2 (и, может быть, несколько версий до этого), синтаксис
источник
Используя
str(e)
илиrepr(e)
для представления исключения, вы не получите фактическую трассировку стека, поэтому не полезно искать, где находится исключение.После прочтения других ответов и документации по пакету журналирования следующие два способа отлично работают для печати реальной трассировки стека для упрощения отладки:
использовать
logger.debug()
с параметромexc_info
использование
logger.exception()
или мы можем напрямую использовать
logger.exception()
для печати исключения.источник