2009-07-02 24 views
5

Tôi không chắc chắn sự khác biệt giữa các cách khác nhau để xử lý lỗi.Tôi cần thêm thông tin về HandleError

Trong MVC asp.net (dự án mặc định) họ đặt này trên đầu trang của lớp

[HandleError]

Vì vậy, tôi đã được đọc một số blog và người đó nói này

". ... nói với khung làm việc rằng nếu một ngoại lệ chưa được giải quyết xảy ra trong bộ điều khiển của bạn thay vì hiển thị màn hình màu vàng mặc định của Death thì thay vào đó nó sẽ phục vụ một khung nhìn có tên là Error. "

http://blog.dantup.me.uk/2009/04/aspnet-mvc-handleerror-attribute-custom.html

Vì vậy, điều đó có nghĩa là tôi không nên đánh bắt bất kỳ lỗi nào (tức là không có sản lượng đánh bắt thử)?

Sau đó tôi đang tìm kiếm trong một cuốn sách và họ có

[HandleError(ExceptionType=typeof(InsufficientMemoryException),View="About")] 
public ActionResult HandleError() 
{ 
    throw new 
InsufficientMemoryException(); 
    return View("Home"); 
} 

Vì vậy, họ chỉ cần đặt nó trên đầu trang của ActionResult này và cung cấp cho nó một loại ngoại lệ. Câu hỏi đầu tiên của tôi là điều gì sẽ xảy ra nếu bạn có thêm một lỗi mà bạn đang ném? Ngoài ra tôi nghĩ bạn nên xử lý tất cả các lỗi. Tôi biết đây chỉ là một ví dụ nhỏ nhưng bạn không nên bắt MemoryException ở đâu đó hoặc làm điều này vít lên "HandleError" nếu bạn làm gì?

Tôi cũng nhận thấy trong khi nhìn vào nó trong VS rằng HandleError có 2 phương thức quá tải. Một trong số đó là ở trên và một là HandError().

Vậy tại sao trong tệp mẫu asp.net MVC chỉ [HandleError] chứ không phải [HandleError()]? Là một trong những được sử dụng cho các phương pháp hành động và một được sử dụng cho những lớp học? Tôi giả định HandleError ở đầu lớp một sẽ giống như HandleError (typeof (ngoại lệ))?

và cuối cùng có một cái gì đó được gọi là IExceptionFilter. Vì vậy, bạn đang sử dụng này nếu bạn muốn đăng nhập tất cả các trường hợp ngoại lệ hoặc nếu bạn có một số ngoại lệ đặc biệt mà bạn muốn làm một cái gì đó khác với?

Cũng giống như nếu tôi chỉ muốn ghi lại tất cả ngoại lệ, tôi sẽ làm cái gì khác đặc biệt với NullReferenceexception?

Tôi đã xem hướng dẫn này http://dimecasts.net/Casts/CastDetails/37 và tôi không thấy điều này "ActionFilterAttribute" mà họ đang nói đến. Đây có phải là từ một phiên bản cũ hay gì đó không?

Giống như dường như nó có 4 phương pháp mà bạn có thể sử dụng và bạn phải ghi đè lên chúng. Trong cuốn sách của tôi nó chỉ nói về những:

  1. IAuthorizationFilter
  2. IActionFilter
  3. IResultFilter
  4. IExceptionFilter

và họ là tất cả các giao diện vì vậy không trọng. Không phải của họ mặc dù có 4 phương pháp. Chỉ một hoặc 2.

Cảm ơn

Một điều nữa. Bạn có nên kiểm tra mọi ngoại lệ không?Giống như một trong những phương pháp của tôi có thể gặp phải 7 ngoại lệ khác nhau. Tôi có nên kiểm tra cho tất cả 7 ngoại lệ (tức là vứt chúng) sau đó cuối cùng bắt chúng và xử lý chúng (tôi thường chỉ in một số thông báo ra).

Nếu có thì VS2008 có thứ gì đó tìm thấy các ngoại lệ có thể xảy ra. Tôi thấy thật khó để nói đôi khi điều gì có thể là ném một ngoại lệ sau đó tôi phải săn lùng cái nào.

Trả lời

2

"Không bao giờ" bẫy System.Exception. Bạn có thể ẩn một vấn đề. Tốt hơn là "Thất bại nhanh".

ngoại lệ bẫy Chỉ rằng:

  • Bạn biết có thể xảy ra và
  • đó bạn duyên dáng có thể phục hồi từ và
  • đó bạn không thể xem trước emptively kiểm tra

Vì vậy, để trả lời câu hỏi cuối cùng của bạn, tôi sẽ không bẫy những ngoại lệ đó nếu bạn có thể kiểm tra các điều kiện trong mã. Ví dụ, nếu FileNotFound là một trong số chúng, thay vì bẫy FileNotFoundException, hãy kiểm tra tệp. Nếu NullReference là một, kiểm tra nếu đối tượng là null thay vì bắt ngoại lệ.

Đề xuất của Andrew để sử dụng ELMAH để đăng nhập ngoại lệ không được xử lý, hoặc bất kỳ ngoại lệ nào cho vấn đề đó, là một điều tuyệt vời, IMO.

2

Điều quan trọng nhất cần lưu ý là bạn luôn phải bẫy các lỗi mà bạn biết có thể xảy ra. Tiếp theo, bạn không nên cố gắng bẫy từng lỗi duy nhất được biết đến với con người ... bạn có thể ở trong mã của bạn cả ngày thêm những thứ như vậy. Thuộc tính [HandleError] về bản chất là một trình xử lý lỗi toàn cục cho biết nếu có bất kỳ lỗi nào xảy ra trong bộ điều khiển này, hãy gửi chúng đến trang được cấu hình. Điều này là tốt đẹp trong đó ra khỏi hộp bạn đang xử lý tất cả các lỗi độc đáo! Điều tiếp theo là xử lý một lỗi cụ thể theo một cách nhất định. Bạn có thể nói nếu xảy ra lỗi XYZ, hãy truy cập trang này thay vì trang lỗi được xử lý toàn cục. Nếu có nhiều lỗi xảy ra ... cái đầu tiên sẽ thắng. Có nghĩa là nếu bạn có kế hoạch để bắt hai loại lỗi ... mà bao giờ một xảy ra đầu tiên sẽ kiểm soát trang mà bạn đang chuyển hướng quá.

Điều tiếp theo mà bạn có thể xem xét cho bất kỳ trang asp.net nào (biểu mẫu web hoặc mvc) là khung công tác ELMAH. Nó sẽ ghi lại và nắm bắt mọi lỗi mà trang web của bạn gây ra. Điều này sẽ giúp bạn giải quyết bất kỳ lỗi nào mà bạn không biết ... để bạn không phải lên kế hoạch cho tất cả chúng lên phía trước. Điều tốt đẹp về khung công tác này là bạn có thể gửi cho nó một email khi một lỗi xảy ra cũng như đăng nhập vào một tệp xml (trong số các khả năng cấu hình khác). Rất tiện dụng!

Hy vọng tôi đã giải quyết tất cả các truy vấn của bạn!

+1

Hmm để xử lý lỗi là nếu bạn muốn một trang chung cho tất cả các lỗi? Nếu bạn muốn có nhiều lỗi cụ thể hơn thì bạn đặt nó trên actionView? Làm thế nào về "IExceptionFilter" khi nào tôi sẽ sử dụng cái này? Đây có phải là nơi tôi sẽ là công cụ đăng nhập của tôi (hoặc mã Elmah) không? Ngoài ra tôi vẫn không chắc chắn mã trông như thế nào? Tôi không xử lý các lỗi (try/catch) hay tôi vẫn xử lý chúng. Tôi không rõ ràng nếu tôi sẽ xử lý chúng nếu điều đó gây nhầm lẫn [HandleError]. Ngoài ra, nếu tôi xử lý chúng, điều đó sẽ không ngăn chặn khung làm việc của ELMAH đối với các ngoại lệ được xử lý? Tức là tôi sẽ cần phải đăng nhập những cái đã biết bằng tay? – chobo2

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