2012-03-02 60 views
5

Đây là ứng dụng đầu tiên của tôi sẽ xử lý ngoại lệ đúng cách. Đó là một dịch vụ WCF. Tất cả những thứ khác trước đây là những ứng dụng đơn giản chỉ dành cho bản thân tôi. Tôi có kiến ​​thức rất nhỏ về xử lý ngoại lệ trong C#.Cách bắt ngoại lệ

Tôi có một mã như thế này:

MembershipUser memUser = Membership.GetUser(username); 

DatabaseDataContext context = new DatabaseDataContext(); 
UserMembership user = UserMembership.getUserMembership(memUser); 
ItemsForUser itemUser = Helper.createItemForUser(ref item, memUser); 
Helper.setItemCreationInfo(ref item, user); 
context.Items.InsertOnSubmit(item); 
context.SubmitChanges(); 

Trong mã này một vài trường hợp ngoại lệ có thể xảy ra. Ví dụ như NullReferenceException. Làm cách nào để tôi biết đối tượng nào gây ra ngoại lệ nên tôi có thể biết phải làm gì trong quá trình bắt và những gì cần trả lại cho khách hàng?

+0

Bạn có thể tìm thấy câu trả lời này và các liên kết trong đó có liên quan: http://stackoverflow.com/a/7152374/625332 – Dmitry

Trả lời

9

Nói chung, bạn không nên bắt được bất kỳ ngoại lệ nào.

Tôi biết điều này có vẻ kỳ lạ, nhưng thực tế là bạn chỉ nên bắt ngoại lệ bạn thực sự có thể làm điều gì đó và bạn thường không thể làm gì về ngoại lệ.

"ngoại lệ" đối với quy tắc này phải làm với ý nghĩa của việc "xử lý" ngoại lệ. Trong một số ứng dụng, "xử lý" ngoại lệ có nghĩa là đăng nhập nó. Trong những trường hợp khác (ví dụ, ASP.NET), tốt hơn là không phải là xử lý ngoại lệ, vì khung (ASP.NET Health Monitoring trong trường hợp này) sẽ ghi lại nó cho bạn.

Trong mã hướng sự kiện, như Windows Forms, tôi thấy cần thiết để bắt ngoại lệ trong trình xử lý sự kiện. Ít nhất là trong các phiên bản trước của .NET, cho phép ngoại lệ lan truyền ra ngoài, ví dụ, một sự kiện nhấn nút tạo ra các kết quả khó chịu. Tôi thường bắt ngoại lệ và hiển thị nó trong một hộp thoại.

Trong một ứng dụng đa tầng, người ta có thể bắt ngoại lệ trên ranh giới tầng, sau đó rethrow một, tầng cụ thể ngoại lệ mới:

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    throw new TierException("Some message", ex); 
} 

Một trường hợp sử dụng là để bắt ngoại lệ, sau đó ném một ngoại lệ mới với nhiều thông tin trong đó:

public int GetValueFromConfigurationFile(...) 
{ 
    const string configFileName = "..."; 
    try 
    { 
     // ... 
    } 
    catch (FileNotFoundException fEx) 
    { 
     throw new InvalidOperationException(
      String.Format("Can't find configuration file {0}", configFileName), 
      fEx); 
    } 
} 

trong trường hợp này, bạn đang bắt một ngoại lệ cụ thể (FileNotFoundException), và cung cấp thông tin người gọi của bạn họ có thể không nếu không biết: rằng tập tin không tìm thấy là một tập tin cấu hình.

Thông điệp chung là: - Chỉ bắt ngoại lệ bạn biết làm thế nào để xử lý - Catch the ngoại lệ cụ thể nhất có thể - Luôn luôn bao gồm các ngoại lệ bên trong khi tạo ra một ngoại lệ mới, để duy trì chuỗi các trường hợp ngoại lệ - Để rethrow ngoại lệ hiện tại, sử dụng throw;, không phải throw ex;

Có thêm một số khác và tôi sẽ cố gắng tìm cho bạn tham chiếu từ Nguyên tắc thiết kế khung của Microsoft.

P.S. Nếu ai đó có thể tìm thấy câu hỏi này là bản sao của, hãy đóng một bản sao. Tôi không ngại mất bất kỳ đại diện nào từ việc này. Tôi không thể tìm thấy bản sao.


tôi nên có chỉ đăng các liên kết đến các "ngoại lệ xử lý" tag wiki, nơi nó nói:

Tuy nhiên, để xử lý ngoại lệ trong bối cảnh các chương trình .NET, xem "Design Guidelines for Exceptions ".

+0

Câu trả lời này đá vớ của tôi. – CptSupermrkt

+0

Cảm ơn, nhưng nó không thực sự _my_ trả lời. Tôi chỉ cần tìm các liên kết. –

1

Mặc dù WCF có cơ chế truyền ngoại lệ máy chủ cho khách hàng nhưng có lẽ đáng xem xét nếu người dùng khách hàng của bạn thực sự muốn xem ngoại lệ phía máy chủ phức tạp.
Nói chung tốt hơn để truy vấn phía máy chủ dấu vết - và nếu bạn muốn truy cập từ xa đó, hãy sử dụng trình ghi nhật ký truy tìm từ xa. Hoặc có một văn bản đơn dấu vết api trên máy chủ của bạn để đăng nhập máy khách ngoại lệ phía khách hàng trong một thời trang không phô trương.