2010-08-01 28 views
7
Ben net bir dosya indirirken am

başarısız dosya değil, hatanın log ve yapıyorum rağmen başarısız nasıl:istisna

try: 

except IOError as e: 
    print e; 

ise: sorguda p

bir hata var, giriş yapmak istiyorum ve bir sonraki dosya ile devam ediyorum.

Bu döngüde, herhangi bir nedenle dosya adı kötüyse veya web sitesi kapalıymış gibi bir görüntü indirmeye çalışıyorum, for döngüsündeki bir sonraki öğeye devam etmek istiyorum.

Başarısız olan ve işlemeye devam edecek daha genel bir hata var mı?

Ayrıca, bir dosyaya hataları nasıl kaydedebilirim?

+0

Hata oluştuğunda, devam edemezsiniz - indirme bozuk. Hangi özel hatayla karşılaşıyorsunuz? –

+0

Bunu bir for döngüsünde yaşıyorum, neden hatayı yakalayamıyorum, sonra devam edip bir sonraki dosyayı deneyemiyorum? – Blankman

+0

@Blankman: Herhangi bir kod sağlamadığınızdan, neden hatayı "yakalayamadığınızı, sonra devam edip bir sonraki dosyayı deneyebileceğiniz" olduğunu tahmin etmek imkansızdır. –

cevap

6

olarak Lott dikkat çekti: senaryoyu Koşu

import logging 
logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
        format='%(asctime)s %(levelname)s %(name)s %(message)s') 
logger=logging.getLogger(__name__) 

try: 
    1/0 
except ZeroDivisionError as err: 
    logger.error(err) 

/tmp/myapp.log yazıyor Sorun yukarı yönde (veya indirme adresinizle) düzeltildi, yapabileceğiniz en iyi şey tekrar denemek. durum, yüklemeler listesi var ve sadece üzerinde atlamak istiyorsanız olmasıdır, ancak daha sonra yerine çıktıktan indirmelerini başarısız oldu:

logf = open("download.log", "w") 
for download in download_list: 
    try: 
     # code to process download here 
    except Exception as e:  # most generic exception you can catch 
     logf.write("Failed to download {0}: {1}\n".format(str(download), str(e))) 
     # optional: delete local version of failed download 
    finally: 
     # optional clean up code 
     pass 

Unutulmaması gereken nokta: bir

(1) Kullan " ~ unutbu tarafından önerildiği gibi logging "modül, aynı anda farklı kanallardan yazılı, size zaman damgası dahil günlük çıkışı ile daha fazla esneklik ve güç verir (örn stderr'si dosyası), hata seviyelerine bağlı olarak vs vs.

(2) Yukarıdaki mantığı "with" yapısını kullanarak kullanmayı düşünebilirsiniz.

+0

logf nedir, google'da 'python logf' araması yaparken bunu hiçbir yerde bulamıyor. – Blankman

+0

ah, onun sadece bir değişken günlüğü kullanırken üzgün olduğunu düşündüm. – Blankman

6

Sen logging module kullanabilirsiniz: Bir indirme sürece, başarısız olup olmadığını

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero 
+1

Güzel. Ancak indirme hala bozuk. Bu sihirle "başarısız" ve "işlemeye devam et" yapmaz. –

2

Bu her şeyi yakalar. Ancak, kesin istisnayı yakalamak çok daha iyidir. piton < = Bu bir günlük dosyasına hatayı yazmak ve kod çalışmaya devam edecektir 2,7

while True 
    try: 
    doStuff() 
    except Exception, e: 
    f = open('log.txt', 'w') 
    f.write('An exceptional thing happed - %s' % e) 
    f.close() 
0

.