2008-12-03 37 views
35

Tôi theo truyền thống triển khai một tập hợp các trang web cho phép xác nhận thủ công chức năng ứng dụng lõi. Một ví dụ là LoggerTest.aspx tạo và ghi lại một ngoại lệ kiểm tra. Tôi đã luôn luôn chọn để tăng DivideByZeroException bằng cách sử dụng một cách tiếp cận tương tự như đoạn mã sau:Cách tốt nhất để tăng ngoại lệ trong C# là gì?

try 
{ 
    int zero = 0; 
    int result = 100/zero; 
} 
catch (DivideByZeroException ex) 
{ 
    LogHelper.Error("TEST EXCEPTION", ex); 
} 

Mã hoạt động tốt nhưng tôi cảm thấy phải có một giải pháp thanh lịch hơn. Có cách nào tốt nhất để tăng ngoại lệ trong C#?

+0

Cảm ơn thông tin phản hồi. Tôi đã đánh dấu câu trả lời của GalacticCowboy là chính xác vì nó rõ ràng là câu trả lời đúng dựa trên cách câu hỏi được diễn đạt. Cảm ơn một lần nữa vì phản hồi và xin lỗi nếu câu hỏi là mơ hồ. –

+0

Đối với những người suy nghĩ "có được nhiều hơn cho câu hỏi này", bạn nói đúng. Về bản chất tôi đang tìm kiếm một cách tốt nhất để nâng cao/gây ra/mô phỏng một ngoại lệ. Như James Curran đã nói, đó là sự xuất hiện của ngoại lệ thay vì ném một ngoại lệ mà tôi theo sau. Buộc một DivideByZeroException là chiến lược mặc định của tôi mặc dù tôi nghĩ rằng có thể có một cách khác hoặc thậm chí là một ngoại lệ tốt hơn để buộc. Nhiều khả năng không có sự khác biệt giữa ném và "tăng" ngoại lệ. Phần lớn các câu trả lời dường như có ý kiến ​​này ít nhất. –

Trả lời

64
try 
{ 
    throw new DivideByZeroException(); 
} 
catch (DivideByZeroException ex) 
{ 
    LogHelper.Error("TEST EXCEPTION", ex); 
} 
+2

Điều này hơi nguy hiểm. CLR sẽ hoạt động khác nhau khi người dùng tăng rõ ràng một ngoại lệ thường được CLR nêu ra. Xem bài đăng này để biết thêm chi tiết: http://blogs.msdn.com/jaredpar/archive/2008/10/22/when-can-you-catch-a-stackoverflowexception.aspx – JaredPar

+0

Tuy nhiên, chia cho 0 ngoại lệ vốn đã là có thể kiểm tra và ném mà không có * thực sự * cố gắng thực hiện việc phân chia. Một tràn ngăn xếp là một con thú khác nhau, và được ghi lại như vậy. Các trường hợp ngoại lệ khác cũng lưu ý "không có ý định được ném bởi các chú thích -loại mã máy khách". – GalacticCowboy

+0

Chỉ dành cho StackOverfloWExceptions. Đó là bởi vì nhiều lần, điều khoản bắt vẫn sẽ được sâu trong ngăn xếp và tràn ngăn xếp chính nó. Ngoại lệ đó không bao giờ bị bắt hoặc xử lý khi được CLR ném. – configurator

23

Câu trả lời ngắn:

throw new Exception("Test Exception"); 

Bạn sẽ cần

using System; 
+0

Bạn không nên sử dụng Ngoại lệ, bạn nên sử dụng một triển khai hiện có hoặc tự tạo của riêng bạn. Ngoại lệ quá chung chung. Brad Abrams (thuộc nhóm thiết kế .NET framework) tuyên bố rằng họ muốn họ có thể làm lại lớp đó với một nhà xây dựng riêng để tránh việc sử dụng nó như thế này –

+0

Điều này rất tốt cho việc kiểm tra nhật ký kiểm tra mới. Rất cơ bản sẽ phá vỡ. làm việc cho tôi, cảm ơn. – JoshYates1980

+0

Đăng nhập để bỏ phiếu cho việc này. Tôi chưa thấy một lý do chính đáng để KHÔNG làm theo cách này, đặc biệt là để kiểm tra logger. – VSO

3

ném exceptionhere;

Phải không?

Ví dụ tôi thấy được

 if (args.Length == 0) 
     { 
      throw new ArgumentException("A start-up parameter is required."); 
     } 
1

throw new DivideByZeroException("some message");?

Hoặc tôi có thiếu gì đó không?

0

Vì mục đích thử nghiệm, bạn có thể muốn tạo một lớp cụ thể (có thể là TestFailedException?) Và ném nó thay vì cướp một loại ngoại lệ khác.

1

Nếu bạn chỉ đang thử nghiệm phương pháp Lỗi của LogHelper, tại sao lại ném ngoại lệ? Bạn chỉ cần một lớp lót:

LogHelper.Error("TEST EXCEPTION", new Exception("This is a test exception")); 
+0

+1 từ tôi, mặc dù câu hỏi là tổng quát hơn một chút - phương pháp ưa thích để đưa ra một ngoại lệ là gì? – GalacticCowboy

3

Vì vậy, hãy để tôi tiếp tục quảng cáo chiêu hàng để tiếp tục làm theo cách của bạn. Bạn không muốn kiểm tra điều gì xảy ra khi một số DivideByZeroException bị ném; bạn muốn kiểm tra điều gì sẽ xảy ra khi sự chia cho 0 thực sự xảy ra.

Nếu bạn không thấy sự khác biệt, hãy cân nhắc: Bạn có thực sự chắc chắn khi bạn muốn kiểm tra NullRefernceException và khi nào cho ArgumentNullException?

2

Cảm ơn phản hồi. Tôi đã đánh dấu câu trả lời của GalacticCowboy là chính xác vì nó rõ ràng là câu trả lời đúng dựa trên cách câu hỏi được diễn đạt.

Đối với những người nghĩ "có nhiều câu hỏi này", bạn nói đúng. Về bản chất tôi đang tìm kiếm một cách tốt nhất để nâng cao/gây ra/mô phỏng một ngoại lệ. Như James Curran đã nói, đó là sự xuất hiện của ngoại lệ thay vì ném một ngoại lệ mà tôi theo sau. Buộc một DivideByZeroException là chiến lược mặc định của tôi mặc dù tôi nghĩ rằng có thể có một cách khác hoặc thậm chí là một ngoại lệ tốt hơn để buộc.

Nhiều khả năng không có sự khác biệt giữa việc ném và "tăng" ngoại lệ. Phần lớn các câu trả lời dường như có ý kiến ​​này ít nhất.

Cảm ơn bạn một lần nữa vì đã phản hồi và xin lỗi nếu câu hỏi không rõ ràng.

5

Tạo ngoại lệ tùy chỉnh cho mục đích thử nghiệm? Sau đó, bạn có thể thêm bất kỳ thuộc tính tùy chỉnh nào bạn muốn ngoại lệ mang theo theo cách của nó thông qua quá trình xử lý/ghi nhật ký ngoại lệ ...

[Serializable] 
public class TestException: ApplicationException 
{ 
    public TestException(string Message, 
        Exception innerException): base(Message,innerException) {} 
    public TestException(string Message) : base(Message) {} 
    public TestException() {} 

    #region Serializeable Code 
    public TestException(SerializationInfo info, 
      StreamingContext context): base(info, context) { } 
    #endregion Serializeable Code 
} 

trong lớp học của bạn

try 
{ 
     throw new TestException(); 
} 
catch(TestException eX) 
{ 
    LogHelper.Error("TEST EXCEPTION", eX); 
} 
1
 try 
     { 
      string a="asd"; 
      int s = Convert.ToInt32(a); 
     } 
     catch (Exception ex) 
     { 

      Response.Write(ex.Message); 
     } 

Nó sẽ trở lại ngoại lệ "chuỗi đầu vào không được trong một định dạng chính xác."

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