Tăng cảnh báo trong Python mà không làm gián đoạn chương trình


187

Tôi đang cố gắng nâng Cảnh báo trong Python mà không làm chương trình bị sập / dừng / ngắt.

Tôi sử dụng chức năng đơn giản sau đây để kiểm tra xem người dùng có chuyển một số khác không cho nó không. Nếu vậy, chương trình nên cảnh báo họ, nhưng tiếp tục như bình thường. Nó sẽ làm việc như mã dưới đây, nhưng nên sử dụng lớp Warning(), Error()hoặc Exception()thay vì in cảnh báo ra bằng tay.

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

Nếu tôi sử dụng mã dưới đây và truyền 0 cho hàm, chương trình gặp sự cố và giá trị không bao giờ được trả về. Thay vào đó, tôi muốn chương trình tiếp tục bình thường và chỉ cần thông báo cho người dùng rằng anh ta đã chuyển 0 cho hàm.

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

Tôi muốn có thể kiểm tra xem một cảnh báo đã bị ném không bằng cách kiểm tra nó. Nếu tôi chỉ đơn giản là in thông báo ra, tôi không thể kiểm tra nó với assertRaises một cách không đáng tin cậy.


Làm thế nào chính xác bạn muốn thông báo cho người dùng? qua email hay SMS? nguyên nhân có thể được nối lên nhưng bạn cần phải cụ thể.
aaronasterling

2
Tại sao bạn không chỉ printlà tin nhắn?
sje394

1
@ sje394 Vấn đề là tôi muốn có thể kiểm tra rằng một cảnh báo đã được đưa ra để kiểm tra nó một cách không đáng tin cậy. Nếu tôi chỉ đơn giản là in thông báo ra, tôi không thể làm điều đó với assertRaises một cách không đáng tin cậy.
Tomas Novotny

Câu trả lời:


157

Bạn không nên raisecảnh báo, bạn nên sử dụng warningsmô-đun. Bằng cách nâng cao, bạn đang tạo ra lỗi, thay vì cảnh báo.


1
Cảm ơn rât nhiều. Và làm thế nào để tôi kiểm tra rằng Cảnh báo đã bị ném bằng cách sử dụng không đáng tin cậy nhất? Tôi không thể sử dụng assertRaises () nữa.
Tomas Novotny

@Tomas Novotny bạn có thể chụp stdout và stderr, sau đó kiểm tra xem các chuỗi được đưa ra bởi cảnh báo của bạn có được tìm thấy trong đó không.
Wheaties

15
@Tomas: Tôi chưa bao giờ nghe nói về mong muốn kiểm tra để cảnh báo, nhưng có sẵn một trình warnings.catch_warningsquản lý bối cảnh sẽ cho phép bạn làm điều này.
SilentGhost

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

Xem tài liệu về python: tại đây


4
warnings.warn("blabla", DeprecationWarning)để thêm một lớp vào loại cảnh báo được đưa ra
shadi

51

Theo mặc định, không giống như một ngoại lệ, một cảnh báo không làm gián đoạn.

Sau import warningsđó, có thể chỉ định lớp Cảnh báo khi tạo cảnh báo. Nếu một cái không được chỉ định, nó UserWarningtheo nghĩa đen theo mặc định.

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

Thay vào đó, chỉ đơn giản là sử dụng một lớp có sẵn, ví dụ DeprecationWarning:

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

Tạo một lớp cảnh báo tùy chỉnh tương tự như tạo một lớp ngoại lệ tùy chỉnh:

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

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

Để thử nghiệm, xem xét assertWarnshoặc assertWarnsRegex.


Để thay thế, đặc biệt là cho các ứng dụng độc lập, hãy xem xét loggingmô-đun. Nó có thể ghi nhật ký các thông báo có mức độ gỡ lỗi , thông tin , cảnh báo , lỗi , v.v ... Các thông điệp nhật ký có mức cảnh báo hoặc cao hơn theo mặc định được in ra stderr.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.