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))
Isso não parece funcionar, recebo erro de sintaxe, qual é a maneira correta de fazer isso para registrar todos os tipos de exceções em um arquivo
,
depoisexcept
.,
depoisexcept
, receberáglobal name 'e' is not defined
, o que não é muito melhor do que a sintaxe errada.except Exception as e
ouexcept Exception, e
, dependendo da versão do Python.Respostas:
Você precisa definir qual tipo de exceção deseja capturar. Portanto, escreva em
except Exception, e:
vez deexcept, e:
para uma exceção geral (que será registrada de qualquer maneira).Outra possibilidade é escrever toda a sua tentativa / exceto código desta maneira:
no Python 3.xe versões modernas do Python 2.x, use em
except Exception as e
vez deexcept Exception, e
:fonte
logger.exception(e)
. Ele registrará a exceção com rastreamento no mesmologging.ERROR
nível.except Exception, e:
lança um erro de sintaxe para mim no python 3. Isso é esperado?except Exception as e:
A sintaxe não é mais suportada no python 3. Use o seguinte.
fonte
logging.error('foo %s', str(e))
sempre será convertidae
em uma sequência. Para alcançar o que você está procurando, você usarialogging.error('foo %s', e)
- permitindo assim que a estrutura de log fizesse (ou não) a conversão.logger.exception(e)
. Ele registrará a exceção com rastreamento no mesmologging.ERROR
nível.except BaseException
eexcept Exception
não está no mesmo nível.except Exception
funciona em Python3, mas não será capturado,KeyboardInterrupt
por exemplo (o que pode ser muito conveniente se você quiser interromper seu código!), enquantoBaseException
captura qualquer exceção. Veja este link para a hierarquia de exceções.Atualizando isso para algo mais simples para o logger (funciona para python 2 e 3). Você não precisa do módulo traceback.
Esta é agora a maneira antiga (embora ainda funcione):
exc_value é a mensagem de erro.
fonte
Existem alguns casos em que você pode usar o e.message ou e.messages .. Mas ele não funciona em todos os casos. De qualquer forma, o mais seguro é usar o str (e)
fonte
except Exception as e
, ee
é umIOError
, você começae.errno
,e.filename
ee.strerror
, mas aparentemente nãoe.message
(pelo menos em Python 2.7.12). Se você deseja capturar a mensagem de erro, usestr(e)
, como nas outras respostas.Se você deseja a classe de erro, a mensagem de erro e o rastreamento de pilha (ou alguns deles), use
sys.exec_info()
.Código de trabalho mínimo com alguma formatação:
O que fornece a seguinte saída:
A função sys.exc_info () fornece detalhes sobre a exceção mais recente. Retorna uma tupla de
(type, value, traceback)
.traceback
é uma instância do objeto traceback. Você pode formatar o rastreio com os métodos fornecidos. Mais informações podem ser encontradas na documentação do traceback .fonte
e.__class__.__name__
pode retornar a classe de exceção.Você pode usar
logger.exception("msg")
para registrar a exceção com o traceback:fonte
e.msg
é a representação de string daException
classe.logger.exception(e)
.Após o python 3.6, você pode usar a string formatada literal. Está arrumado! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
fonte
Você pode tentar especificar o tipo BaseException explicitamente. No entanto, isso capturará apenas derivados de BaseException. Embora isso inclua todas as exceções fornecidas pela implementação, também é possível gerar classes arbitrárias de estilo antigo.
fonte
Use str (ex) para imprimir a execução
fonte
para os futuros lutadores, no python 3.8.2 (e talvez algumas versões antes disso), a sintaxe é
fonte
Usando
str(e)
ourepr(e)
para representar a exceção, você não receberá o rastreamento de pilha real, portanto, não é útil descobrir onde está a exceção.Depois de ler outras respostas e o documento do pacote de log, as duas maneiras a seguir funcionam muito bem para imprimir o rastreamento de pilha real para facilitar a depuração:
use
logger.debug()
com parâmetroexc_info
usar
logger.exception()
ou podemos usar diretamente
logger.exception()
para imprimir a exceção.fonte