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 sepertinya tidak berhasil, saya mendapatkan kesalahan sintaksis, apa cara yang tepat untuk melakukan ini untuk masuk semua jenis pengecualian ke file
,
setelahnyaexcept
.,
setelahexcept
, Anda akan mendapatkanglobal name 'e' is not defined
, yang tidak jauh lebih baik daripada sintaks yang salah.except Exception as e
atauexcept Exception, e
, tergantung pada versi Python.Jawaban:
Anda harus menentukan jenis pengecualian yang ingin Anda tangkap. Jadi tulis
except Exception, e:
alih-alihexcept, e:
untuk pengecualian umum (yang akan tetap dicatat).Kemungkinan lain adalah menulis seluruh percobaan Anda / kecuali kode dengan cara ini:
dalam Python 3.x dan versi modern dari Python 2.x digunakan
except Exception as e
sebagai gantiexcept Exception, e
:sumber
logger.exception(e)
. Ini akan mencatat pengecualian dengan traceback padalogging.ERROR
level yang sama .except Exception, e:
melempar kesalahan Sintaks kepada saya di python 3. Apakah ini diharapkan?except Exception as e:
Sintaks tidak lagi didukung dalam python 3. Gunakan yang berikut sebagai gantinya.
sumber
logging.error('foo %s', str(e))
akan selalu dikonversie
ke string. Untuk mencapai apa yang Anda inginkan, Anda akan menggunakanlogging.error('foo %s', e)
- dengan demikian memungkinkan kerangka logging untuk melakukan (atau tidak melakukan) konversi.logger.exception(e)
. Ini akan mencatat pengecualian dengan traceback padalogging.ERROR
level yang sama .except BaseException
danexcept Exception
tidak berada pada level yang sama.except Exception
tidak bekerja di Python3, tetapi tidak akan menangkapKeyboardInterrupt
misalnya (yang bisa sangat nyaman jika Anda ingin dapat mengganggu kode Anda!), sedangkanBaseException
menangkap pengecualian apa pun. Lihat tautan ini untuk hierarki pengecualian.Memperbarui ini menjadi sesuatu yang lebih sederhana untuk logger (berfungsi untuk python 2 dan 3). Anda tidak perlu modul traceback.
Ini sekarang cara lama (meskipun masih berfungsi):
exc_value adalah pesan kesalahan.
sumber
Ada beberapa kasus di mana Anda dapat menggunakan e.message atau e.messages .. Tetapi tidak berfungsi dalam semua kasus. Pokoknya yang lebih aman adalah dengan menggunakan str (e)
sumber
except Exception as e
, dane
merupakanIOError
, Anda mendapatkane.errno
,e.filename
dane.strerror
, tapi tampaknya tidak adae.message
(setidaknya di Python 2.7.12). Jika Anda ingin menangkap pesan kesalahan, gunakanstr(e)
, seperti pada jawaban lainnya.Jika Anda ingin kelas kesalahan, pesan kesalahan dan jejak stack (atau beberapa di antaranya), gunakan
sys.exec_info()
.Kode kerja minimal dengan beberapa format:
Yang menghasilkan output sebagai berikut:
Fungsi sys.exc_info () memberi Anda detail tentang pengecualian terbaru. Ini mengembalikan tuple dari
(type, value, traceback)
.traceback
adalah turunan dari objek traceback. Anda dapat memformat jejak dengan metode yang disediakan. Lebih banyak dapat ditemukan dalam dokumentasi traceback .sumber
e.__class__.__name__
dapat mengembalikan kelas pengecualian juga.Anda dapat menggunakan
logger.exception("msg")
untuk mencatat pengecualian dengan traceback:sumber
e.msg
adalah representasi string dariException
kelas.logger.exception(e)
.Setelah python 3.6, Anda bisa menggunakan string literal yang diformat. Itu rapi! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
sumber
Anda dapat mencoba menentukan jenis BaseException secara eksplisit. Namun, ini hanya akan menangkap turunan dari BaseException. Meskipun ini mencakup semua pengecualian yang disediakan implementasi, juga dimungkinkan untuk meningkatkan kelas gaya lama yang sewenang-wenang.
sumber
Gunakan str (ex) untuk mencetak eksekusi
sumber
untuk pejuang masa depan, dalam python 3.8.2 (dan mungkin beberapa versi sebelum itu), sintaksnya adalah
sumber
Menggunakan
str(e)
ataurepr(e)
untuk mewakili pengecualian, Anda tidak akan mendapatkan jejak tumpukan yang sebenarnya, sehingga tidak membantu untuk menemukan di mana pengecualian itu.Setelah membaca jawaban lain dan dokumen paket logging, dua cara berikut berfungsi dengan baik untuk mencetak jejak stack yang sebenarnya untuk memudahkan debugging:
gunakan
logger.debug()
dengan parameterexc_info
menggunakan
logger.exception()
atau bisa langsung kita gunakan
logger.exception()
untuk mencetak pengecualian.sumber