2010-11-17 26 views
7

Tôi đang viết thư viện dùng chung nền tảng (.so trong linux và .dll trong cửa sổ) bằng C. Hiện tại khi có lỗi, chức năng thư viện trả lại mã lỗi thích hợp và ghi thông tin lỗi vào số stderr. Chức năng thư viện cũng phát ra một số thông tin và thông báo gỡ lỗi đến stdout. Điều này hoạt động tốt cho các máy khách dựa trên bảng điều khiển.Lỗi xử lý chiến lược trong thư viện dùng chung - C

Bây giờ thư viện này sẽ có các chương trình khách hàng sử dụng GUI được lập trình bằng C++ & wxWidgets. Tôi tự hỏi điều gì sẽ là thực hành tốt nhất trong việc xử lý các lỗi và thông báo cho nó? Ứng dụng UI có thể truy cập dữ liệu đến stdoutstderr trên tất cả các nền tảng không?

Một cách khác mà tôi đã nghĩ là chức năng khởi tạo thư viện khởi tạo cấu trúc sẽ có con trỏ hàm. Tất cả các hàm trên thư viện sẽ lấy một cá thể của cấu trúc này và gọi các con trỏ hàm. Bằng cách này, khách hàng có thể chọn nơi in các tin nhắn.

Tôi tự hỏi điều gì sẽ là cách rõ ràng để giải quyết vấn đề này? Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.

Trả lời

14

Thực tiễn tốt nhất (IMHO) là dành cho thư viện để không in bất kỳ thứ gì vào stderr (hoặc stdout), bởi vì chúng thậm chí có thể không có mặt. Ngoài tình huống GUI, bạn cũng có trường hợp sử dụng ứng dụng máy chủ không có "giao diện điều khiển" và có thể muốn lỗi ghi nhật ký bằng cách sử dụng một hàm như syslog().

Một số phương pháp để xử lý thông tin báo lỗi mà không in trực tiếp:

  • trở lại một mã lỗi số, và cung cấp một chức năng cho biến nó thành một chuỗi

  • trở lại một struct/đối tượng mã lỗi , có chứa thông tin bổ sung

  • cung cấp chức năng trên đối tượng "phiên" trả về thông tin về lỗi cuối cùng

  • cho phép người gọi để đăng ký một callback đó là viện dẫn trong trường hợp xảy ra lỗi

Một ngoại lệ cho "không viết thư cho thiết bị lỗi chuẩn từ một thư viện" quy tắc rằng tôi là hợp lý thoải mái với là nếu một thư viện có tham số "chế độ gỡ lỗi" cho phép ghi nhật ký thông tin chi tiết vào stderr.

10

Nói chung, bạn không nên viết thư cho stdout ở tất cả từ thư viện của mình - ngay cả trong ứng dụng bảng điều khiển có thể làm hỏng đầu ra mà ứng dụng đang tạo. stderr có thể tha thứ hơn một chút, nhưng bạn vẫn không thực sự sử dụng trừ khi ứng dụng yêu cầu.

OpenSSL là thư viện được chia sẻ trên nhiều nền tảng có cùng một vấn đề cần giải quyết. Phương thức của họ có thư viện ghi lại thông tin lỗi chi tiết trong hàng đợi lỗi nội bộ, mà ứng dụng có thể yêu cầu khi một giá trị trả về lỗi được nhìn thấy và sau đó hiển thị cho người dùng theo bất kỳ cách nào là thích hợp. (Nó cũng cung cấp một chức năng tiện lợi mà đổ toàn bộ hàng đợi lỗi đến FILE *).

+0

một câu hỏi khác. Vì vậy, trong OpenSSL, hàng đợi lỗi nội bộ bị xóa như thế nào? –

+0

@Appu: Có một chức năng được cung cấp cho ứng dụng để yêu cầu "lỗi tiếp theo". Điều này loại bỏ lỗi sớm nhất từ ​​hàng đợi nội bộ và trả về nó cho ứng dụng. – caf

1

Trên Linux, thay vì in lỗi trên đầu ra tiêu chuẩn (hoặc lỗi chuẩn), bạn nên ghi lại lỗi bằng cách sử dụng rsyslog. Vì bạn đang xử lý GUI, có thể bạn cũng có thể bật một hộp tin nhắn (không phải lúc nào).

Tôi không biết gì về các cửa sổ, nhưng tôi nghĩ nó có thứ gì đó tương tự.

2

Đối với tin nhắn tường trình, bạn nên cho phép ứng dụng cung cấp chức năng gọi lại cho thư viện để khách hàng có thể quyết định phải làm gì với chúng, ví dụ: gửi tới syslog hoặc hiển thị trong cửa sổ trên màn hình.

Để được trả lại lỗi, bạn có ba chiến lược cơ bản:

  1. trở lại một mã lỗi và có một chức năng mà chuyển nó thành một thông điệp
  2. vượt qua một tham số con trỏ trỏ đến một đối tượng mà sẽ tổ chức báo lỗi thông tin tin nhắn
  3. Có một số đối tượng thư viện chung có chứa thông tin lỗi từ thao tác cuối cùng.

Dù bạn làm gì, bạn không muốn chỉ cần đăng nhập thông báo lỗi vì khách hàng có thể muốn làm điều gì đó với nó. ví dụ. trình bày một hộp thoại.

Tôi có thể đi với 2 phần lớn.

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