2010-04-27 43 views
6

Tôi có một hệ thống trong đó employeeId phải luôn tồn tại trừ khi có một số vấn đề cơ bản.C# Ném ngoại lệ khi sử dụng Assert?

Con đường tôi nhìn thấy nó, là tôi có hai lựa chọn để kiểm tra mã này:

1:

public void GetEmployee(Employee employee) 
{ 
    bool exists = EmployeeRepository.VerifyIdExists(Employee.Id); 
    if (!exists) 
    { 
    throw new Exception("Id does not exist"); 
    } 
}  

hoặc 2:

public void GetEmployee(Employee employee) 
{ 
    EmployeeRepository.AssertIfNotFound(Employee.Id); 
} 

Là lựa chọn # 2 chấp nhận được trong ngôn ngữ C#?

Tôi thích nó vì nó gọn gàng trong đó tôi không thích nhìn "ném ngoại lệ mới (" bla bla bla ") nhập tin nhắn outsite phạm vi lớp học.

+1

Tại sao không chỉ có phương pháp VerifyIdExists của bạn ném ngoại lệ thay cho bạn? – Tejs

+0

Tôi không nghĩ có bất cứ điều gì sai trái với những gì bạn có ngoại trừ IMHO Tôi sẽ đổi tên thành ThrowIfNotFound. Tôi lấy nó đây là thứ mà bạn muốn đưa vào bản phát hành cũng như bản dựng gỡ lỗi của bạn. –

Trả lời

3

Nó phụ thuộc những gì bạn có ý nghĩa bởi Assert.

Bạn có thể sử dụng Debug.Assert (hoặc Trace.Assert nếu bạn muốn nó cũng hoạt động ở chế độ phát hành) .Tuy nhiên điều này không hữu ích vì nó tạm dừng chương trình và bật lên hộp thoại cho đến khi người dùng nhấn một cái gì đó. Vì vậy, tôi khuyên bạn nên thay vào đó trong hầu hết các trường hợp mặc dù bạn có thể quyết định cách bạn muốn phản ứng với lỗi - dừng chương trình, hoặc chỉ cần đăng nhập và cố gắng tiếp tục.

Nhưng nếu chúng tôi giả định rằng phương pháp Assert của bạn kiểm tra đối số của nó và có thể ném ngoại lệ, thì có, tôi nghĩ đó là cách hay để thực hiện.

Thực tế để chọn một ví dụ, trong cả hai phương pháp của Jon Skeet, morelinq đều được sử dụng. Ví dụ: here:

public static IEnumerable<TSource> AssertCount<TSource>(
    this IEnumerable<TSource> source, 
    int count, 
    Func<int, int, Exception> errorSelector) 
{ 
    source.ThrowIfNull("source"); 
    if (count < 0) throw new ArgumentException(null, "count"); 
    errorSelector.ThrowIfNull("errorSelector"); 

    return AssertCountImpl(source, count, errorSelector); 
} 
+1

Có. Assert của tôi là cho "Ném một ngoại lệ". Cảm ơn j. – guazz

+0

@guazz: Lần đầu tiên tôi đọc câu hỏi của bạn, tôi nghĩ bạn đã so sánh việc ném với khẳng định - và nhìn vào các câu trả lời và phiếu bầu khác, tất cả mọi người cũng vậy. Bạn có thể muốn viết lại câu hỏi của mình để làm rõ hơn. –

+0

phương pháp mở rộng cho ngoại lệ đối số? –

1

Sử dụng ngoại lệ, những gì chúng có trong trường hợp ngoại lệ. Tất cả các thư viện .NET chuẩn sử dụng phương pháp xử lý các trường hợp như vậy để lấy tín hiệu của bạn từ Microsoft.

5

Theo quy tắc, bạn chỉ nên ném ngoại lệ trong trường hợp đặc biệt. Vì đây là một tình huống như vậy, việc ném một ngoại lệ là điều đúng đắn cần làm.

0

Ý tưởng đằng sau các xác nhận, như tôi đã luôn luôn sử dụng chúng, là chúng là phản hồi ngay lập tức khi chạy bản dựng gỡ lỗi. Một loại trong khuôn mặt của bạn rằng một cái gì đó đã xảy ra. Hoặc đăng nhập vào tệp nếu ứng dụng được thiết lập theo cách đó.

Trường hợp ngoại lệ được sử dụng để xử lý các hành vi ngoại lệ, như đã nêu ở trên.

Những gì tôi làm, đặc biệt là đầu trong chu kỳ dự án cuộc sống có thể là một cái gì đó như:

public void GetEmployee(Employee employee) 
{ 
    bool exists = EmployeeRepository.VerifyIdExists(Employee.Id); 
    Debug.Assert(exists, "employee does not exist for id: " + Employee.Id); 
    if (!exists) 
    { 
    throw new Exception("Id does not exist); 
    } 
} 

lẽ refractoring ra Debug.Assert một khi trục trặc ban đầu được giải quyết.

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