web-dev-qa-db-pt.com

Captura de Mensagem de Exceção do 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))

Isso não parece funcionar, eu recebo erro de sintaxe, o que é a maneira correta de fazer isso para registrar todos os tipos de exceções para um arquivo

365
Hellnar

Você tem que definir qual tipo de exceção você quer pegar. Então escreva except Exception, e: em vez de except, e: para uma exceção geral (que será registrada de qualquer maneira).

Outra possibilidade é escrever todo o seu try/exceto código desta maneira:

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))

no Python 3.xe versões modernas do Python 2.x usam except Exception as e em vez de 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))
519
eumiro

A sintaxe não é mais suportada no python 3. Use o seguinte em seu lugar.

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))
251
sjtaheri

Atualizando isso para algo mais simples para logger (funciona tanto para python 2 e 3). Você não precisa do módulo traceback.

import logging

logger = logging.Logger('catch_all')

def catchEverythingInLog():
    try:
        ... do something ...
    except Exception as e:
        logger.error(e, exc_info=True)
        ... exception handling ...

Este é agora o caminho antigo (embora ainda funcione):

import sys, traceback

def catchEverything():
    try:
        ... some operation(s) ...
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        ... exception handling ...

exc_value é a mensagem de erro.

30
berniey

Existem alguns casos em que você pode usar o e.message ou e.messages .. Mas isso não funciona em todos os casos. De qualquer forma, o mais seguro é usar o str (e)

try:
  ...
except Exception as e:
  print(e.message)
22
Slipstream

Você pode usar logger.exception("msg") para registrar a exceção com traceback:

try:
    #your code
except Exception as e:
    logger.exception('Failed: ' + str(e))
16
Peter

Após o python 3.6, você pode usar o literal de string formatado. É legal! ( 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}")
7
Chuan Ma

Se você deseja classe de erro, mensagem de erro e rastreamento de pilha (ou qualquer um deles), use sys.exec_info().

Código funcional mínimo com alguma formatação,

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)

Que dará a seguinte saída,

Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']

sys.exec_info ()

Isso fornece detalhes da exceção sobre a exceção mais recente. Ele retorna um Tuple. A seguir estão os valores de Tuple (type, value, traceback).

traceback é uma instância do objeto traceback. Você pode formatar o rastreamento com os métodos fornecidos. Mais pode ser encontrado em documentação traceback

7
Kavindu Dodanduwa

Você pode tentar especificar o tipo BaseException explicitamente. No entanto, isso só pegará derivativos de BaseException. Embora isso inclua todas as exceções fornecidas pela implementação, também é possível levantar classes arbitrárias de estilo antigo.

try:
  do_something()
except BaseException, e:
  logger.error('Failed to do something: ' + str(e))
4
Heini Høgnason

Use str (ex) para imprimir exceção

try:
   #your code
except ex:
   print(str(ex))
2
Niraj Trivedi