2009-02-23 16 views
6

Her iki hata ve uyarının ayrıntılarını yaymak için ortak bir desen var mı? hatalarına göre Kod akışının durmasına neden olan ciddi problemleri kastediyorum. uyarılar Kullanıcıyı bir problem hakkında bilgilendiren, ancak program akışını durdurmak için çok önemsiz olan sorunları kastediyorum.Hem hataların hem de uyarıların ayrıntılarını yaymak için bir model var mı?

Şu anda sabit hatalarla ilgilenmek için istisnalar ve uyarıları kaydetmek için Python günlük çerçevesi kullanıyorum. Ama şimdi, şu anda işlenmekte olan kaydın bir veritabanı alanında uyarıları kaydetmek istiyorum. Sanırım, uyarıların istisnalarla aynı şekilde, ama program akışını durdurmadan kabarcıklanmasını istiyorum.

>>> import logging 
>>> 
>>> def process_item(item): 
...  if item: 
...   if item == 'broken': 
...    logging.warning('soft error, continue with next item') 

...  else: 
...   raise Exception('hard error, cannot continue') 
... 
>>> process_item('good') 
>>> process_item(None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in process_item 
Exception: hard error, cannot continue 
>>> process_item('broken') 
WARNING:root:soft error, continue with next item 

Bu örnek (ve benim şimdiki sorun) Python içindedir, ama çok istisnalar dışında diğer diller için de geçerli olmalıdır. David 'ın önerisi ve aşağıdaki örnekle kısa oyun sonrasında


, Python'un warnings modül gitmek yoludur.

import warnings 

class MyWarning(Warning): 
    pass 

def causes_warnings(): 
    print 'enter causes_warnings' 
    warnings.warn("my warning", MyWarning) 
    print 'leave causes_warnings' 

def do_stuff(): 
    print 'enter do_stuff' 
    causes_warnings() 
    causes_warnings() 
    causes_warnings() 
    print 'leave do_stuff' 

with warnings.catch_warnings(record=True) as w: 
    # Cause all warnings to always be triggered. 
    warnings.simplefilter("always") 
    # Trigger a number of warnings. 
    do_stuff() 
    # Do something (not very) useful with the warnings generated 
    print 'Warnings:',','.join([str(warning.message) for warning in w]) 

Çıktı:

enter do_stuff 
enter causes_warnings 
leave causes_warnings 
enter causes_warnings 
leave causes_warnings 
enter causes_warnings 
leave causes_warnings 
leave do_stuff 
Warnings: my warning,my warning,my warning 

Not: Python 2.6+ catch_warnings için gereklidir.

+0

FYI, çözümünüzü bir yanıt olarak göndermekten daha iyi olurdu, bu soruya cevap vermek yerine… bunu anladığınıza sevindim. –

+0

Örneğinizi sizinkine yorum olarak ekleyebilirim, ancak bir yorumda güzel biçimlendirme yapamıyorum. – Mat

+0

+1 takip için – jfs

cevap

7

Bak, terminal olmayan hata işleme bir dilden diğerine büyük ölçüde değişir gibi, dil belirtmeden kadar bu sorun hakkında söyleyebiliriz orada olduğunu sanmıyorum http://docs.python.org/library/warnings.html

.

+0

+1: uyarı modülü. İlk kez (soooo birçok seçenek) yapılandırmak için bir kez ama kurallar bir kez yapılandırdı. –

+0

Melezleme uyarıları ve kayıt modülleri kolay değildir, ancak bazı işlerde mümkündür. – jfs

-1

Önemli hatalar balonu kaldırmalı, uyarı yalnızca istisnalar atmadan günlüğe kaydedilmelidir. Python'un warnings modüle

İlgili konular