2008-09-09 29 views

Trả lời

57

Theo Jeffery Richter trong cuốn sách Khung Hướng dẫn thiết kế:

System.ApplicationException là một lớp học mà không phải là một phần của .NET framework.

Nó được dự định có một số ý nghĩa trong đó bạn có khả năng có thể bắt "tất cả" ngoại lệ của ứng dụng, nhưng mẫu không được theo dõi và do đó không có giá trị.

+2

Thật đáng kinh ngạc khi xem xét tài liệu của Microsoft Press cho kỳ thi MCTS 70-536 rõ ràng nói ngược lại ... gah! –

+0

Không bao giờ hoàn toàn tin tưởng các cuốn sách thi MS. Tôi đã đọc vài trong số họ - luôn luôn đầy lỗi. – user1068352

+0

Điều này không thực sự trả lời câu hỏi. Bạn có nói rằng ngoại lệ ứng dụng tùy chỉnh nên kế thừa từ 'Ngoại lệ'? Nếu vậy, bạn có thể nói như vậy? –

18

ApplicationException considered useless là một đối số mạnh mẽ và quan trọng đối với ApplicationException.

Ảnh chụp nhanh: không sử dụng. Có nguồn gốc từ Exception.

+0

Yeah, Konrad có nó ngay. Trên một lưu ý liên quan: một điều khác nghĩ hữu ích (hoặc "thực hành tốt nhất") nhưng thực sự không phải là [triển khai ICloneable] (http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx). – Craig

13

Các tác giả của khuôn khổ này tự xem xét ApplicationException vô giá trị:

http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

với theo dõi tốt đẹp ở đây:

http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

Khi nghi ngờ, tôi làm theo thiết kế Khung cuốn sách của họ Hướng dẫn.

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

Chủ đề của bài đăng blog là tiếp tục thảo luận ở đó.

rp

1

Tôi đang sử dụng để làm:

private void buttonFoo_Click() 
{ 
    try 
    { 
     foo(); 
    } 
    catch(ApplicationException ex) 
    { 
     Log.UserWarning(ex); 
     MessageVox.Show(ex.Message); 
    } 
    catch(Exception ex) 
    { 
     Log.CodeError(ex); 
     MessageBox.Show("Internal error."); 
    } 
} 

Nó cho phép để làm sự khác biệt giữa:

  • C# hệ thống mã lỗi mà tôi phải sửa chữa.
  • Lỗi người dùng "thông thường" không cần chỉnh sửa từ tôi.

Tôi biết không nên sử dụng ApplicationException, nhưng nó hoạt động tốt vì có very few classes không tôn trọng mẫu ApplicationException.

+2

Rất ít bạn biết. Bất kỳ ai tuân thủ Nguyên tắc thiết kế khung sẽ không được lấy từ ApplicationException. Nếu bạn muốn duy trì mẫu này, thì bạn cần phải tạo kiểu của riêng mình như MyApplicationExcptionBase và lấy được tất cả các ngoại lệ tùy chỉnh của bạn từ đó. BTW, các hướng dẫn nói để tạo ra vài loại ngoại lệ có nguồn gốc. –

+0

Bạn nói đúng: hôm nay, nếu tôi phải bắt đầu từ đầu, tôi sẽ tạo ra một ngoại lệ "UserError". Tuy nhiên, tôi sẽ không refactor mã cũ của tôi: nó không phải là rất phê bình. –

21

Bạn nên lấy ngoại lệ tùy chỉnh từ System.Exception.

Thậm chí MSDN nói ngay bây giờ để bỏ qua ApplicationException:

Nếu bạn đang thiết kế một ứng dụng mà cần phải tạo riêng trường hợp ngoại lệ của nó, bạn nên để lấy được ngoại lệ tùy chỉnh từ ngoại lệ lớp.Ban đầu, người ta nghĩ rằng ngoại lệ tùy chỉnh sẽ xuất phát từ lớp ApplicationException; tuy nhiên trong thực tế điều này đã không được tìm thấy để thêm giá trị đáng kể. Để biết thêm thông tin, hãy xem Best Practices for Handling Exceptions.

http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

+1

Trích dẫn nói rằng, nhưng ok, chỉnh sửa để rõ ràng hơn. – Blorgbeard

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