2009-02-23 28 views
6

Có một mô hình phổ biến để tuyên truyền chi tiết về cả lỗi và cảnh báo không? Bởi lỗi Tôi có nghĩa là các vấn đề nghiêm trọng sẽ khiến luồng mã dừng lại. Bởi cảnh báo Tôi có nghĩa là các vấn đề đáng công bố cho người dùng về sự cố, nhưng quá tầm thường để dừng luồng chương trình.Có một mẫu để truyền thông tin chi tiết về cả lỗi và cảnh báo không?

Tôi hiện đang sử dụng ngoại lệ để xử lý các lỗi cứng và khung ghi nhật ký Python để ghi lại các cảnh báo. Nhưng bây giờ tôi muốn ghi lại cảnh báo trong một trường cơ sở dữ liệu của hồ sơ hiện đang được xử lý thay thế. Tôi đoán, tôi muốn các cảnh báo bong bóng theo cách tương tự như trường hợp ngoại lệ, nhưng không dừng lưu trình chương trình.

>>> 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 

Ví dụ này (và vấn đề hiện tại của tôi) bằng Python, nhưng cũng áp dụng cho các ngôn ngữ khác có ngoại lệ.


Tiếp theo đề nghị David 's và một vở kịch ngắn với các ví dụ dưới đây, mô-đun warnings Python là con đường để đi.

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]) 

Output:

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 

Lưu ý: Python 2.6+ là cần thiết cho catch_warnings.

+0

FYI, có thể sẽ tốt hơn khi đăng giải pháp của bạn dưới dạng câu trả lời, thay vì chỉnh sửa nó thành câu hỏi ... tốt đẹp mà bạn đã tìm ra. –

+0

Tôi đã đặt ví dụ của tôi làm nhận xét cho bạn nhưng tôi không thể định dạng tốt trong nhận xét. – Mat

+0

+1 để theo dõi – jfs

Trả lời

7

Nhìn vào mô-đun warnings Python, http://docs.python.org/library/warnings.html

Tôi không nghĩ rằng có nhiều bạn có thể nói về vấn đề này mà không chỉ định ngôn ngữ, như xử lý lỗi không thiết bị đầu cuối khác nhau rất nhiều từ một ngôn ngữ khác.

+0

+1: mô-đun cảnh báo. Icky để cấu hình lần đầu tiên (soooo nhiều tùy chọn) nhưng một khi cấu hình nó quy tắc. –

+0

Cảnh báo lai và mô-đun ghi nhật ký không dễ dàng nhưng có thể với một số công việc. – jfs

-1

Lỗi nghiêm trọng sẽ phát sinh, cảnh báo chỉ nên được đăng nhập tại chỗ mà không phải ném ngoại lệ.

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