2008-09-30 34 views

Trả lời

9

Như với bất kỳ dự án .net tôi tìm ra cách tốt nhất là chỉ bắt loại lỗi cụ thể nếu họ có thể xảy ra trên các trang nhất định. Ví dụ: bạn có thể bắt Định dạng ngoại lệ cho đầu vào do người dùng cung cấp (chỉ trong trường hợp xác thực JavaScript không thành công và bạn không sử dụng tryparse) nhưng luôn để việc bắt ngoại lệ cấp cao nhất cho trình xử lý lỗi toàn cục.

 try 
     { 
      //Code that could error here 
     } 
     catch (FormatException ex) 
     { 
      //Code to tell user of their error 
      //all other errors will be handled 
      //by the global error handler 
     } 

Bạn có thể sử dụng mã nguồn mở elmah (Modules Logging Lỗi và Handlers) cho ASP.Net để làm cấp cao nhất/lỗi toàn cầu này đánh bắt cho bạn nếu bạn muốn.

Sử dụng elmah nó có thể tạo nhật ký lỗi có thể xem được mặc dù một giao diện web cấu hình đơn giản. Bạn cũng có thể lọc các loại lỗi khác nhau và có các trang lỗi tùy chỉnh của riêng bạn cho các loại lỗi khác nhau.

3

Một thực tiễn mà tôi thấy đặc biệt hữu ích là tạo trang lỗi chung, sau đó đặt defaultRedirect của bạn trên nút customErrors của web.config thành trang lỗi đó. Sau đó thiết lập global.asax của bạn để ghi lại tất cả các ngoại lệ chưa được xử lý và sau đó đặt chúng (các ngoại lệ chưa được giải quyết) trong một thuộc tính tĩnh trên một số lớp (tôi có một lớp được gọi là ErrorUtil với một thuộc tính LastError tĩnh). Sau đó, trang lỗi của bạn có thể xem xét thuộc tính này để xác định nội dung sẽ hiển thị cho người dùng.

Xem thêm chi tiết ở đây: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx

+0

Chúng tôi làm điều tương tự cho tất cả các trường hợp ngoại lệ unhandled. –

+0

Điều đó nghe có vẻ rất không an toàn, có giá trị đáng ngờ cho HttpContext.Current.Server.GetLastError() và tất nhiên có vấn đề 200 mã chuyển hướng trong .NET2.0 – annakata

+0

Nghe có vẻ rất không an toàn, nhưng tôi không làm việc với các ứng dụng lưu lượng truy cập đủ cao để lo lắng về điều đó. Nếu bạn đang làm việc với công cụ lưu lượng truy cập cao hơn thì đó có thể là vấn đề. –

0

Vâng, đó là khá rộng mở, đó là hoàn toàn mát mẻ. Tôi sẽ giới thiệu cho bạn một từ .doc bạn có thể tải xuống từ Dot Net Spider, đây thực sự là cơ sở cho tiêu chuẩn mã của công ty nhỏ của tôi. Tiêu chuẩn này bao gồm một số mẹo xử lý lỗi rất hữu ích.

Một ví dụ như vậy cho trường hợp ngoại lệ (tôi không nhớ nếu đây là bản gốc của tài liệu hoặc nếu chúng tôi thêm tài liệu đó vào tài liệu): Không bao giờ thực hiện “ngoại lệ bắt và không làm gì cả.” Nếu bạn ẩn ngoại lệ, bạn sẽ không bao giờ biết nếu ngoại lệ xảy ra. Bạn nên luôn luôn cố gắng tránh ngoại lệ bằng cách kiểm tra tất cả các điều kiện lỗi theo lập trình.

Ví dụ về những gì không nên làm:

try 
{ 
    ... 
} 
catch{} 

Rất nghịch ngợm, trừ khi bạn có một lý do chính đáng cho nó.

0

Bạn nên đảm bảo rằng bạn có thể bắt được hầu hết các lỗi do ứng dụng của bạn tạo và hiển thị thông báo thân thiện với người dùng. Nhưng tất nhiên bạn không thể bắt tất cả các lỗi cho rằng bạn có thể sử dụng web.config và defaultRedirect bởi một người dùng khác. Một công cụ rất tiện dụng khác để ghi lại các lỗi là ELMAH. ELMAH sẽ ghi lại tất cả các lỗi được tạo ra bởi ứng dụng của bạn và hiển thị nó cho bạn theo một cách rất dễ đọc. Việc cắm ELMAH vào ứng dụng của bạn cũng đơn giản như thêm vài dòng mã trong tệp web.config và đính kèm assembly. Bạn chắc chắn sẽ cung cấp cho ELMAH một thử nó nghĩa đen sẽ giúp bạn tiết kiệm giờ và giờ đau.

http://code.google.com/p/elmah/

0
  1. Mã phòng thủ trong mỗi trang cho trường hợp ngoại lệ mà bạn mong đợi có thể xảy ra và đối phó với chúng một cách thích hợp, vì vậy không làm gián đoạn người dùng mỗi khi một ngoại lệ xảy ra.

  2. Ghi lại tất cả ngoại lệ, với tham chiếu.

  3. Cung cấp trang lỗi chung, cho bất kỳ trường hợp ngoại lệ chưa được xử lý nào, cung cấp tham chiếu để sử dụng để hỗ trợ (hỗ trợ có thể xác định chi tiết từ nhật ký). Không hiển thị ngoại lệ thực tế, vì hầu hết người dùng sẽ không hiểu nó nhưng là một nguy cơ bảo mật tiềm ẩn vì nó phơi bày thông tin về hệ thống của bạn (mật khẩu tiềm năng, v.v.).

  4. Không bắt tất cả ngoại lệ và không làm gì với chúng (như trong câu trả lời ở trên). Hầu như không bao giờ có lý do chính đáng để làm điều này, đôi khi bạn có thể muốn bắt một ngoại lệ cụ thể và không cố tình làm gì nhưng điều này nên được sử dụng một cách khôn ngoan.

0

Không phải lúc nào cũng chuyển ý tưởng người dùng sang trang lỗi chuẩn. Nếu người dùng đang làm việc trên biểu mẫu, họ có thể không muốn bị chuyển hướng khỏi biểu mẫu mà họ đang làm việc. Tôi đặt tất cả các mã có thể gây ra một ngoại lệ bên trong khối try/catch, và bên trong khối catch tôi nhổ ra một thông điệp cảnh báo cảnh báo người dùng rằng đã xảy ra lỗi cũng như ghi ngoại lệ trong cơ sở dữ liệu bao gồm đầu vào biểu mẫu, chuỗi truy vấn , vv Tuy nhiên, tôi đang phát triển một trang web nội bộ nên hầu hết người dùng chỉ gọi cho tôi nếu họ gặp sự cố. Đối với một trang web công cộng, bạn có thể muốn sử dụng một cái gì đó như elmah.

1

Tôi có nên thử tất cả mọi thứ không? Đôi khi tôi không muốn bắt bất cứ điều gì cụ thể, và một lỗi sẽ được bắt bởi một phương pháp cao hơn trong hệ thống phân cấp anyway.

Nếu đây là phương pháp chính, phương pháp hay nhất của phương pháp phụ là gì?


private void mainMethod() 
{ 

    try 
    { 

    subMethod(); 
    } 
    catch 
    { 
    //do something 
    } 
} 

này:


private void subMethod() 
{ 
    try{ 
    //code 
    //code 
    } 
    catch 
    { 
    throw; 
    } 
} 

Hoặc này:


private void subMethod() 
{ 
    //code 
    //code 
} 

0
public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo) 
    { 
     string authenticationID = string.Empty; 
     int customerID = 0; 
     string message = string.Empty; 
     DA_Customer oDACustomer = new DA_Customer(); 

     using (TransactionScope scope = new TransactionScope()) 
     { 
      if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y") 
      { 
       // if a new student 
       if (oCustomerInfo.CustId == 0) 
       { 
        oCustomerInfo.CustPassword = General.GeneratePassword(6, 8); 
        oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false); 
        authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID); 
        oCustLessonBookInfo.CustId = customerID; 
       } 
       else // if existing student 
       { 
        oCustomerInfo.UpdatedByCustomer = "Y"; 
        authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo); 
       } 
       message = authenticationID; 
       // insert lesson booking details 
       new DA_Lesson().BookLesson(oCustLessonBookInfo); 
      } 

      else 
      { 
       message = "login exists"; 
      } 
      scope.Complete(); 
      return message; 
     } 

    } 
+0

Bạn chưa cung cấp bất kỳ giải thích nào về cách thức hoặc lý do chặn mã này có liên quan đến câu hỏi đang được hỏi. – Hearth

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