web-dev-qa-db-fra.com

capture de message d'exception 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))

Cela ne semble pas fonctionner, j'obtiens une erreur de syntaxe. Quelle est la bonne façon de procéder pour enregistrer toutes sortes d'exceptions dans un fichier?

365
Hellnar

Vous devez définir le type d'exception que vous souhaitez capturer. Donc, écrivez except Exception, e: au lieu de except, e: pour une exception générale (qui sera enregistrée de toute façon).

Une autre possibilité consiste à écrire tout votre try/except code de cette façon:

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

dans Python 3.x et les versions modernes de Python 2.x, utilisez except Exception as e au lieu 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

La syntaxe n'est plus prise en charge dans python 3. Utilisez plutôt la commande suivante.

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

Mettre à jour ceci en quelque chose de plus simple pour logger (fonctionne à la fois pour Python 2 et 3). Vous n'avez pas besoin du module de traçage.

import logging

logger = logging.Logger('catch_all')

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

C'est maintenant l'ancienne méthode (même si elle fonctionne toujours):

import sys, traceback

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

exc_value est le message d'erreur.

30
berniey

Dans certains cas, vous pouvez utiliser le e.message ou e.messages .. Mais cela ne fonctionne pas dans tous les cas. Quoi qu’il en soit, le plus sûr est d’utiliser str (e)

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

Vous pouvez utiliser logger.exception("msg") pour enregistrer une exception avec traceback:

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

Après Python 3.6, vous pouvez utiliser un littéral de chaîne formaté. C'est chouette! ( 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

Si vous voulez une classe d'erreur, un message d'erreur et une trace de pile (ou l'un d'eux), utilisez sys.exec_info().

Code de travail minimal avec un peu de formatage,

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)

Ce qui donnera la sortie suivante,

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

Cela vous donne les détails de l'exception sur la plus récente exception. Il retourne un tuple. Voici les valeurs de nuplets (type, value, traceback).

traceback est une instance d'objet traceback. Vous pouvez formater la trace avec les méthodes fournies. Plus d'informations peuvent être trouvées à partir de documentation de traceback

7

Vous pouvez essayer de spécifier explicitement le type BaseException. Cependant, cela ne capturera que les dérivés de BaseException. Bien que cela inclue toutes les exceptions fournies par l'implémentation, il est également possible de lever des classes arbitraires de style ancien.

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

Utilisez str (ex) pour imprimer une exception

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