2012-03-26 31 views
25

Những người có sử dụng để bắt, ghi nhật ký và báo cáo nhiều lỗi xác thực dữ liệu cùng một lúc bằng Python?Cách thành ngữ để thu thập và báo cáo nhiều ngoại lệ trong Python

Tôi đang xây dựng một ứng dụng bằng Python 3 trước tiên xác thực dữ liệu đầu vào và sau đó xử lý dữ liệu đó. Lỗi báo cáo trong bước đầu tiên là một phần của chức năng dự định của chương trình, vì vậy tôi không muốn trình xác thực của tôi từ bỏ ngoại lệ đầu tiên. Đặc biệt, dữ liệu là dạng bảng và tôi muốn có thể trả về - thay vì tăng - một ngoại lệ cho mỗi dòng của bảng không xác thực.

Một forum discussion from a couple of years ago chiêm ngắm nhiều giải pháp, bao gồm những điều sau đây, trong đó có vẻ sạch nhất với tôi:

errors = [] 
for item in data: 
    try: 
     process(item) 
    except ValidationError as e: 
     errors.append(e) 
if errors: 
    raise MultipleValidationErrors(errors) 

nơi lớp MultipleValidationErrors sẽ có một __str__ phương pháp thích hợp để liệt kê thông tin hữu ích về tất cả các ValidationErrors trong đó.

Những người khác khuyên bạn nên sử dụng mô-đun traceback, nhưng vì các ngoại lệ tôi muốn bắt là lỗi xác thực dữ liệu thay vì lỗi chương trình, điều đó có vẻ không phù hợp. Tuy nhiên, việc có được mô-đun logging có thể thích hợp.

+1

Có thể [câu hỏi này] (http://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block) sẽ giúp – inspectorG4dget

+3

@ inspectorG4dget: câu hỏi đó là về việc bắt nhiều loại ngoại lệ; điều này là về việc bắt nhiều phiên bản của cùng một loại ngoại lệ. –

+0

Mã bạn liệt kê sẽ hoạt động, nếu mã bạn thực hiện những gì bạn muốn hoặc bạn có thể sử dụng mô-đun truy nguyên để cung cấp nhiều thông tin hơn, như bạn đề cập. Ngoài ra, bạn có thể lưu đối tượng ngoại lệ trong cấu trúc dữ liệu để sử dụng sau này hoặc làm nhiều việc khác. Tất cả phụ thuộc vào yêu cầu của bạn để đáp ứng các ngoại lệ là gì, điều này không rõ ràng từ câu hỏi của bạn. –

Trả lời

6

Tôi đã sử dụng thành ngữ này trong cả C++ và Python. Đó là giải pháp sạch nhất mà tôi biết khi nào bạn muốn là một ngoại lệ, chứ không phải là một thông điệp tường trình. Nhược điểm của nó là ngoại lệ kết hợp chiếm không gian tuyến tính nói chung, có thể có vấn đề khi xử lý các tập dữ liệu lớn với nhiều lỗi.

+4

Câu trả lời này dường như thiếu ngữ cảnh khi đọc độc lập. Tôi không biết bạn đang đề cập đến thành ngữ nào. – ThorSummoner

+1

@ThorSummoner Tôi nghĩ rằng larsmans đề cập đến cách OP thu thập các ngoại lệ khác nhau trong một danh sách, và sau đó đặt ra một ngoại lệ duy nhất có chứa danh sách. – Pedro

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