Saya mencoba untuk meningkatkan Peringatan dengan Python tanpa membuat program crash / stop / interrupt.
Saya menggunakan fungsi sederhana berikut untuk memeriksa apakah pengguna memberikan angka bukan nol. Jika demikian, program harus memperingatkan mereka, tetapi lanjutkan seperti biasa. Seharusnya berfungsi seperti kode di bawah ini, tetapi harus menggunakan kelas Warning()
, Error()
atau Exception()
bukannya mencetak peringatan secara manual.
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Jika saya menggunakan kode di bawah ini dan meneruskan 0 ke fungsi, program macet dan nilainya tidak pernah dikembalikan. Sebagai gantinya, saya ingin program untuk melanjutkan secara normal dan hanya memberitahu pengguna bahwa ia melewati 0 ke fungsi.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Saya ingin dapat menguji bahwa suatu peringatan telah dilemparkan mengujinya dengan cara yang belum terbukti. Jika saya hanya mencetak pesan, saya tidak dapat mengujinya dengan assertRaises di unittest.
sumber
print
pesan saja?Jawaban:
Anda seharusnya tidak memberi
raise
peringatan, Anda harus menggunakanwarnings
modul. Dengan menaikkannya Anda menghasilkan kesalahan, bukan peringatan.sumber
warnings.catch_warnings
pengelola konteks yang memungkinkan Anda melakukan ini.Lihat dokumentasi python: di sini
sumber
warnings.warn("blabla", DeprecationWarning)
untuk menambahkan kelas untuk jenis peringatan yang dikeluarkanSecara default, tidak seperti pengecualian, peringatan tidak mengganggu.
Setelah
import warnings
itu, dimungkinkan untuk menentukan kelas Peringatan saat membuat peringatan. Jika tidak ditentukan, secara harfiah adalahUserWarning
default.Untuk hanya menggunakan kelas yang sudah ada sebagai gantinya, misalnya
DeprecationWarning
:Membuat kelas peringatan khusus mirip dengan membuat kelas pengecualian khusus:
Untuk pengujian, pertimbangkan
assertWarns
atauassertWarnsRegex
.Sebagai alternatif, terutama untuk aplikasi mandiri, pertimbangkan
logging
modul ini. Itu dapat mencatat pesan yang memiliki tingkat debug , info , peringatan , kesalahan , dll. Pesan log yang memiliki tingkat peringatan atau lebih tinggi secara default dicetak ke stderr.sumber