Programı kesintiye uğratmadan Python'da uyarıyı artırın


190

Ben program çökmesine / durdurma / kesinti yapmadan Python bir Uyarı yükseltmek çalışıyorum.

Kullanıcının sıfırdan farklı bir sayı geçirip geçirmediğini kontrol etmek için aşağıdaki basit işlevi kullanıyorum. Öyleyse, program onları uyarmalı, ancak normal şekilde devam etmelidir. Aşağıda kodu gibi çalışmalıdır, ancak sınıfını kullanmalısınız Warning(), Error()yoksa Exception()yerine elle uyarı yazdırmanın.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i

Aşağıdaki kodu kullanır ve 0 işlevini geçirirseniz, program çöküyor ve değer asla döndürülür. Bunun yerine, programın normal şekilde devam etmesini ve kullanıcıyı işleve 0 ilettiğini bildirmesini istiyorum.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i

Unittest tarafından test edilerek bir uyarı atıldığını test etmek istiyorum. Mesajı yazdırırsam, unittest'te assertRaises ile test edemiyorum.


Kullanıcıya tam olarak nasıl bildirimde bulunmak istiyorsunuz? e-posta veya SMS yoluyla? çünkü bağlanabilir, ancak spesifik olmanız gerekir.
aaronasterling

2
Neden sadece printmesajı vermiyorsun ?
sje397

1
@ sje397 Mesele şu ki, testtest tarafından test edilen bir uyarı atıldığını test etmek istiyorum. Sadece mesajı yazdırırsam, unittest içindeki assertRaises ile bunu yapamam.
Tomas Novotny

Yanıtlar:


158

Sen olmamalı raise, uyarı kullanıyor olmalıdır warningsmodülü. Bunu kaldırarak uyarı yerine hata üretiyorsunuz.


1
Çok teşekkür ederim. Ve sonra Unittest kullanılarak Uyarı'nın atıldığını nasıl test ederim? Artık assertRaises () kullanamıyorum.
Tomas Novotny

@Tomas Novotny, stdout ve stderr'i yakalayabilir, ardından uyarınız tarafından yayınlanan dizelerin içinde bulunduğunu kontrol edebilirsiniz.
wheaties

15
@Tomas: Uyarı için test etme arzusunu hiç duymadım, ancak warnings.catch_warningsbunu yapmanıza izin verecek bir bağlam yöneticisi var.
SilentGhost

290
import warnings
warnings.warn("Warning...........Message")

Python belgelerine bakın: burada


6
Ve warnings.warn("blabla", DeprecationWarning)verilen uyarı türüne bir sınıf eklemek için
shadi

52

Varsayılan olarak, bir istisnanın aksine, bir uyarı kesilmez.

Daha sonra import warnings, bir uyarı oluştururken bir Uyarılar sınıfı belirtmek mümkündür . Biri belirtilmezse, UserWarningvarsayılan olarak gerçek anlamlıdır.

>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.

Bunun yerine önceden var olan bir sınıfı kullanmak için, örneğin DeprecationWarning:

>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular warning.

Özel bir uyarı sınıfı oluşturmak, özel bir istisna sınıfı oluşturmaya benzer:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

Test için, assertWarnsya da düşünün assertWarnsRegex.


Alternatif olarak, özellikle bağımsız uygulamalar için loggingmodülü düşünün . Hata ayıklama , bilgi , uyarı , hata , vb. Düzeyindeki iletileri günlüğe kaydedebilir . Uyarı veya daha yüksek düzeydeki günlük iletileri varsayılan olarak stderr'a yazdırılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.