2012-09-15 28 views
5

Tôi đang viết một công cụ xử lý một số tệp. Công cụ này sẽ có giao diện dòng lệnh nhưng cũng có thể được sử dụng làm thư viện lớp từ mã của bên thứ ba. Để đối phó với một lỗi, tôi chỉ ném một ngoại lệ. Mã của bên thứ ba có thể xử lý ngoại lệ và giao diện dòng lệnh có thể chỉ in và hủy bỏ. Tuy nhiên, ngoài các lỗi nghiêm trọng, cũng có thể xảy ra tình huống không gây tử vong và quá trình có thể tiếp tục, mà tôi muốn 'ném cảnh báo' và tiếp tục.'Ném cảnh báo' từ mã của tôi

Làm cách nào để xử lý cảnh báo, theo cách đó cả mã của bên thứ ba và giao diện dòng lệnh đều có thể làm điều gì đó với nó?

+0

Thật đáng thất vọng khi C# /. NET không có hệ thống thông thường để tăng cảnh báo như tồn tại ở các ngôn ngữ khác. Trong Python, tôi có thể thực hiện 'warnings.warn ('some message')' hoặc 'logging.warning ('some message')' và biết rằng thông điệp của tôi có khả năng được hiển thị cho mã gọi và các tác giả của nó có thể cấu hình toàn cầu cách cảnh báo được xử lý và đăng nhập. Trong C#, không có một hệ thống tương tự. Bạn không có ý tưởng gì về thư viện đăng nhập, nếu có, ứng dụng gọi đang sử dụng và có lẽ không thể kết nối nó nếu bạn đã làm. Còn gì nữa? Chỉ cần * in * cảnh báo và hy vọng rằng không phá vỡ bất cứ điều gì? –

Trả lời

2

Bạn cũng ném một ngoại lệ cho điều này (giả sử điều kiện lỗi thực sự là ngoại lệ - điều đó được kỳ vọng là hiếm).

Ngoại lệ không phải lúc nào cũng gây tử vong - bạn cần phải ném một loại loại ngoại lệ cụ thể mà mã của bên thứ ba và mã dòng lệnh có thể bắt và thực hiện.

Một quy tắc xử lý ngoại lệ là xử lý các ngoại lệ bạn biết cách xử lý - nếu bạn có loại ngoại lệ cụ thể cho lỗi và bạn ghi lại nó, mã máy khách nên biết cách xử lý nó (hoặc không).


Nếu những gì bạn đang cố gắng làm là cung cấp thông tin để sử dụng mã - cảnh báo được xử lý trong thư viện của bạn đã nhưng mà người dùng có thể muốn biết - bạn có thể dấu vết đầu ra bằng cách sử dụng hệ thống phụ tracing. Tất cả người dùng sẽ cần làm là định cấu hình người nghe và sẽ có thể nhận được thông tin trong thời gian chạy.

+0

Tôi nghĩ rằng cảnh báo thường có nghĩa là kết quả bình thường sẽ được trả về, nhưng nó cũng nên có một cảnh báo kèm theo, bằng cách nào đó. Nhưng nếu bạn sử dụng ngoại lệ, bạn không thể trả về một giá trị cùng một lúc. – svick

+1

@svick - Chắc chắn bạn có thể - với một lớp ngoại lệ tùy chỉnh, bạn có thể thêm bất kỳ thuộc tính bổ sung nào bạn muốn. Và ['Exception'] (http://msdn.microsoft.com/en-us/library/system.exception.aspx) chính nó có thuộc tính KVP' Data' cho việc này. – Oded

3

Tôi khuyên bạn không nên ném ngoại lệ, họ nên tránh nếu có thể (chúng là tài nguyên tốn kém). Thay vào đó, bạn có thể tạo một sự kiện và nâng cao sự kiện đó. Mã của bên thứ ba và giao diện dòng lệnh sẽ chỉ cần ký vào sự kiện này.

+2

Lời khuyên tốt. Nhân viên Google: nếu bạn đang nghĩ "theo dõi ngăn xếp sẽ hữu ích cho cảnh báo này", chỉ cần sử dụng ngoại lệ. Hệ thống ngoại lệ về cơ bản là một hệ thống sự kiện đắt tiền, có giá trị cao. Nếu cảnh báo là hiếm (* và lỗi có thể phục hồi! *), Có thể sử dụng [tùy chỉnh 'Ngoại lệ '.] (Https://msdn.microsoft.com/en-us/library/vstudio/ms229064%28v=vs .100% 29.aspx? F = 255 & MSPPError = -2147217396). Ngoài ra, không mở rộng 'WarningException', vì nó mở rộng' SystemException', và đó là [reserved by convention.] (Https://msdn.microsoft.com/en-us/library/vstudio/ms229007 (v = vs. 100) .aspx) – kdbanman

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