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

이것은 작동하지 않는 것 같습니다. 구문 오류가 발생합니다. 모든 종류의 예외를 파일에 기록하기 위해 이것을 수행하는 올바른 방법은 무엇입니까?



답변

포착하려는 예외 유형을 정의해야합니다. 따라서 일반적인 예외 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: # work on python 2.x
    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: # work on python 3.x
    logger.error('Failed to upload to ftp: '+ str(e))


답변

구문은 더 이상 파이썬 3에서 지원되지 않습니다. 대신 다음을 사용하십시오.

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


답변

이것을 로거를 위해 더 간단한 것으로 업데이트하십시오 (파이썬 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.message 또는 e.messages를 사용할 수있는 경우가 있지만 모든 경우에 작동하지는 않습니다. 어쨌든 str (e) 을 사용하는 것이 더 안전합니다

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


답변

오류 클래스, 오류 메시지 및 스택 추적 (또는 그중 일부)을 원하면을 사용하십시오 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']

sys.exc_info () 함수 는 가장 최근 예외에 대한 세부 사항을 제공합니다. 의 튜플을 반환합니다 (type, value, traceback).

traceback역 추적 객체의 인스턴스입니다. 제공된 방법으로 추적을 형식화 할 수 있습니다. 더 많은 것은 트레이스 백 문서 에서 찾을 수 있습니다 .


답변

logger.exception("msg")트레이스 백으로 예외 로깅에 사용할 수 있습니다 .

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


답변

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