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.
FYI, çözümünüzü bir yanıt olarak göndermekten daha iyi olurdu, bu soruya cevap vermek yerine… bunu anladığınıza sevindim. –
Örneğinizi sizinkine yorum olarak ekleyebilirim, ancak bir yorumda güzel biçimlendirme yapamıyorum. – Mat
+1 takip için – jfs