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))
Ini doesn't tampaknya bekerja, saya mendapatkan kesalahan sintaks, apa adalah cara yang tepat untuk melakukan hal ini untuk mencatat semua jenis pengecualian untuk file
Anda harus menentukan jenis terkecuali anda ingin menangkap. Jadi menulis except Exception, e:
bukan kecuali, e:
untuk umum kecuali (yang akan dicatat pula).
Kemungkinan lain adalah untuk menulis anda coba/kecuali kode seperti ini:
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))
di Python 3.x dan versi modern dari Python 2.x menggunakan kecuali Pengecualian sebagai e
bukan kecuali Pengecualian, 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))
Update ini untuk sesuatu yang sederhana untuk logger (bekerja untuk kedua python 2 dan 3). Anda tidak perlu traceback modul.
import logging
logger = logging.Logger('catch_all')
def catchEverythingInLog():
try:
... do something ...
except Exception as e:
logger.error(e, exc_info=True)
... exception handling ...
Sekarang ini adalah cara lama (meskipun masih bekerja):
import sys, traceback
def catchEverything():
try:
... some operation(s) ...
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
... exception handling ...
exc_value adalah pesan kesalahan.
Ada beberapa kasus di mana anda dapat menggunakan e.pesan atau e.pesan.. Tapi itu tidak bekerja di semua kasus. Pokoknya lebih aman adalah dengan menggunakan str(e)
try:
...
except Exception as e:
print(e.message)
Jika anda ingin kelas kesalahan, kesalahan pesan dan jejak stack (atau beberapa orang), menggunakan sys.exec_info()
.
Kerja Minimal kode dengan format:
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)
Yang memberikan output sebagai berikut:
Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']
Ini memberikan rincian tentang yang paling baru-baru ini pengecualian. Kembali sebuah tuple dari (jenis, nilai, traceback)
.
traceback
adalah contoh dari traceback objek. Anda dapat memformat jejak dengan metode-metode yang disediakan. Lebih lanjut dapat ditemukan di traceback dokumentasi .
Anda dapat mencoba menentukan BaseException jenis secara eksplisit. Namun, ini hanya akan menangkap turunan dari BaseException. Sementara ini meliputi semua pelaksanaan diberikan pengecualian, hal ini juga mungkin untuk meningkatkan sewenang-wenang tua-gaya kelas.
try:
do_something()
except BaseException, e:
logger.error('Failed to do something: ' + str(e))