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