2011-01-25 26 views
57

Các phương pháp hay nhất trong ngành để triển khai ngoại lệ tùy chỉnh trong C# là gì?Các phương pháp hay nhất trong ngành để triển khai ngoại lệ tùy chỉnh trong C# là gì?

Tôi đã kiểm tra Google và có rất nhiều đề xuất, tuy nhiên tôi không biết những đề xuất nào có độ tin cậy cao hơn.

Nếu bất kỳ ai có bất kỳ liên kết nào đến bài viết có thẩm quyền, điều đó cũng sẽ hữu ích.

+1

Tương tự như http://bit.ly/hVTSgp Tôi khuyên bạn nên thu hẹp chủ đề của mình bằng cách giải thích thêm những gì bạn đang tìm kiếm. –

+0

Ông chủ của tôi muốn tôi tạo một lớp ngoại lệ tùy chỉnh cho một chương trình tôi đã viết để chúng tôi có thể dễ dàng xác định các lỗi cụ thể. Nó sẽ là những thứ như: Không có dữ liệu trong một ô excel cụ thể, ngoại lệ vượt trội (có thể sử dụng tiêu chuẩn cho điều này), dữ liệu không được tải lên theo thứ tự cụ thể, v.v. –

+7

Có vẻ như bạn đang sử dụng ngoại lệ để xử lý luồng logic nghiệp vụ - vấn đề cần được giải quyết mà không cần sử dụng ngoại lệ nếu có thể. – cjk

Trả lời

64

Các tiêu chuẩn cho việc tạo ngoại lệ tùy chỉnh là bắt nguồn từ Exception. Sau đó bạn có thể giới thiệu các thuộc tính/phương thức của riêng bạn và các nhà xây dựng quá tải (nếu có).

Dưới đây là ví dụ cơ bản về tùy chỉnh ConnectionFailedException có tham số bổ sung dành riêng cho loại ngoại lệ.

[Serializable] 
public class ConnectionFailedException : Exception 
{ 
    public ConnectionFailedException(string message, string connectionString) 
     : base(message) 
    { 
     ConnectionString = connectionString; 
    } 

    public string ConnectionString { get; private set; } 
} 

Trong ứng dụng, điều này có thể được sử dụng trong trường hợp ứng dụng đang cố kết nối với cơ sở dữ liệu, ví dụ:

try 
{ 
    ConnectToDb(AConnString); 
} 
catch (Exception ex) 
{ 
    throw new ConnectionFailedException(ex.Message, AConnString); 
} 

Đó là tùy thuộc vào bạn để sau đó xử lý các ConnectionFailedException ở mức cao hơn (nếu có)

Cũng có một cái nhìn tại Designing Custom ExceptionsCustom Exceptions

+2

Cool thanks @James ... rất hữu ích – scarpacci

+0

Tại sao không chỉ bắt các ngoại lệ của loại ConnectionFailedException có mục đích hơn? –

+0

@ Ví dụ mẫu hiển thị * cách * bạn tăng 'ConnectionFailedException' kỳ vọng là bạn sẽ bắt được điều này cao hơn lên ngăn xếp cuộc gọi. Bạn có thể bắt được một ngoại lệ có ý nghĩa hơn được nâng lên từ 'ConnectToDb' chứ không phải là một' ngoại lệ 'chung, tuy nhiên, nó chỉ dành cho mục đích trình diễn. – James

8

Đây là đoạn mã để tạo ra một ngoại lệ tùy chỉnh:

using System; 
using System.Runtime.Serialization; 

namespace YourNamespaceHere 
{ 
    [Serializable()] 
    public class YourCustomException : Exception, ISerializable 
    { 
     public YourCustomException() : base() { } 
     public YourCustomException(string message) : base(message) { } 
     public YourCustomException(string message, System.Exception inner) : base(message, inner) { } 
     public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    } 
} 

Xem thêm: http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx

+0

FWIW - đây gần như chính xác là những gì xuất phát từ việc sử dụng đoạn mã 'Ngoại lệ' được bao gồm trong Visual Studio. –

+0

Tuyệt vời. Tôi đã viết bài đăng trên blog vào năm 2005, nhưng tôi nghĩ có một số hướng dẫn từ Microsoft rằng tôi dựa vào nó và có vẻ như hướng dẫn đó đã được mã hóa thành VS thông qua một đoạn trích. –

0

Tôi sử dụng Ngoại lệ tùy chỉnh để giao tiếp bản chất của lỗi.

Ví dụ: tôi thích sử dụng khung được cung cấp "ArgumentNullException" để kiểm tra đối số. Sau đó, khi tôi thấy lỗi này trong trình gỡ rối hoặc trong nhật ký lỗi, tôi ngay lập tức biết được bản chất của lỗi mà không cần đọc thêm nữa.

Đầu kia của quang phổ là InvalidOperationException có thể có ý nghĩa khá nhiều.

Cách thay thế cho ngoại lệ tùy chỉnh là thông báo lỗi chi tiết. Đó là ok, nhưng bằng cách thực hiện một ngoại lệ tùy chỉnh như ConnectionFailed là có ý nghĩa hơn. Sau đó, bản thân thông điệp có thể cung cấp thêm chi tiết.

Khi tạo ngoại lệ tùy chỉnh như vậy, tôi không thêm bất kỳ thuộc tính mới nào. Lý do cho điều này là nếu bạn có một trình ghi lỗi, bạn muốn nó hoạt động trên tất cả các ngoại lệ. Nếu bạn thêm một thuộc tính đặc biệt, thì trình ghi lỗi sẽ bỏ qua nó. Ví dụ, nếu bạn sử dụng MSTest, khi bạn chạy thử nghiệm của bạn và nó không thành công, các thuộc tính tùy chỉnh không được hiển thị. Nhưng nếu bạn gắn bó với thuộc tính Message của baseclass, nó sẽ hiển thị tốt.

Vì vậy, các subclassing là rất đơn giản:

public class NavigationException : Exception{ 
    public NavigationException() {} 
    public NavigationException(string msg) : base(msg) {} 
    public NavigationException(string msg, Exception inner) : base(msg, inner) {} 
} 

này rất đơn giản, làm việc với bất kỳ logger lỗi, và khi tôi nhìn thấy nó, tôi biết đó là một vấn đề Navigation và tôi có thể xem chi tiết nếu cần thiết .

Greg

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