2012-02-03 34 views
22

Tôi đang làm một số toán học đơn giản recessively trong một kịch bản python và đang nhận được cảnh báo sau:Làm thế nào để loại bỏ các thông điệp cảnh báo cụ thể trong python trong khi vẫn giữ tất cả các cảnh báo khác như bình thường?

"Cảnh báo: chia cho số không gặp phải trong phân chia".

Để cung cấp một số bối cảnh, tôi dùng hai giá trị và cố gắng tìm sự khác biệt về giá trị phần trăm (a - b)/a và nếu sau đó nó trên một phạm vi nhất định xử lý nó, nhưng đôi khi giá trị của a hoặc b là zero.

Tôi muốn loại bỏ cảnh báo cụ thể này (tại một dòng cụ thể) nhưng tất cả thông tin tôi đã tìm thấy cho đến nay dường như chỉ cho tôi cách dừng tất cả cảnh báo (mà tôi không muốn).

Khi tôi sử dụng để viết kịch bản shell, tôi có thể làm một cái gì đó như thế này

code... 
more code 2 > error.txt 
even more code 

Trong ví dụ này, tôi sẽ nhận được những lời cảnh báo cho các 'mã' và lệnh 'thậm chí nhiều mã' nhưng không cho dòng thứ hai.

Điều này có khả thi không?

+0

Tại sao không kiểm tra xem a hoặc b = = 0 và không thực hiện tính toán? – AlG

+0

Đó không phải là cảnh báo Python thông thường, bạn có thể hiển thị mã bạn đang chạy không? –

+0

phải là ngoại lệ, không phải là cảnh báo, phải không? bạn không thể bắt được 'ZeroDivisionError'? – mpen

Trả lời

8

Nó dễ dàng hơn để sửa chữa cảnh báo hơn là âm thầm ngăn chặn họ:

if a == 0 or b == 0: 
    return False 

# Your actual code 

Hoặc nếu bạn muốn nhận được ưa thích với cú pháp của Python:

if not all([a, b]): 
    return False 

# Your actual code 

Nó không phức tạp để làm, nhưng Tôi vẫn không làm thế. Từ API:

numpy.seterr(divide='ignore') 
+0

Cảm ơn Máy xay sinh tố, đó là suy nghĩ đầu tiên của tôi nhưng tôi chỉ tò mò nếu có cách để ngăn chặn cảnh báo cụ thể. Nếu không có cách nào (hoặc phức tạp điên rồ của nó sau đó tôi sẽ def theo cách tiếp cận của bạn) – Lostsoul

+1

nếu anh ta thực sự đang làm '(a-b)/a' sau đó kiểm tra nếu một hoặc b là số không là ngớ ngẩn. anh ta chỉ cần kiểm tra một! – mpen

+0

@Mark: Đó là những gì tôi nghĩ ban đầu, nhưng khi OP nói ** nhưng đôi khi giá trị của a hoặc b bằng không **, điều đó làm tôi bối rối. – Blender

42

Nếu scipy đang sử dụng các mô-đun warnings, sau đó bạn có thể ngăn chặn cảnh báo cụ thể. Hãy thử điều này ở phần đầu của chương trình của bạn:

import warnings 
warnings.filterwarnings("ignore", message="divide by zero encountered in divide") 

Nếu bạn muốn điều này chỉ áp dụng cho một phần của mã, sau đó sử dụng quản lý cảnh báo bối cảnh:

import warnings 
with warnings.catch_warnings(): 
    warnings.filterwarnings("ignore", message="divide by zero encountered in divide") 
    # .. your divide-by-zero code .. 
+0

Bằng cách nào? Tôi thấy tôi có thể tắt tất cả các cảnh báo nhưng có thể nhắm mục tiêu một dòng mã cụ thể không? – Lostsoul

+0

oh chỉ thấy cập nhật của bạn! .. Cảm ơn đó là những gì tôi đang tìm kiếm. Một câu hỏi nữa, Có cách nào cụ thể để tìm thông báo cảnh báo hay chỉ đơn giản là những gì đang diễn ra trên màn hình? Nếu tôi nhận được "Cảnh báo: mã của bạn hút, lostsoul!", Sau đó tôi chỉ có thể thêm rằng vào biến tin nhắn ở trên và nó sẽ làm việc? – Lostsoul

+3

Câu trả lời hay. Trên thực tế nó đã cho tôi một số tiền đáng ngạc nhiên của googling để tìm lời giải thích cực kỳ đơn giản này như thế nào để bỏ qua cảnh báo. @Lostsoul bạn có thể sử dụng tin nhắn = 'regex phù hợp với thông báo' để bắt cảnh báo bằng tin nhắn, và cũng có lineno = và module = đối số để bắt theo số dòng và tên mô-đun. – cxrodgers

Các vấn đề liên quan