Search This Blog

Monday, June 27, 2016

Sử dụng Application_Error trong global.asax của ASP.NET MVC để xử lí Exception

ASP.NET MVC hỗ trợ chúng ta rất nhiều cách để handle và xử lí Exception. Ví dụ như:

- Try...catch...trực tiếp trong các action method.

- Override method OnException trong controller.

- Sử dụng thuộc tính HandleError hoặc chúng ta có thể tự tạo thuộc tính để xử lí lỗi thông qua việc kế thừa  HandleErrorAttribute.

- Xử lí HTTP Errors trong file Web.config.

- Xử lí Application_Error trong global.asax.

Tùy vào nhu cầu của mình mà chúng ta có thể xử lí exception theo một hay nhiều cách khác nhau. Trong bài viết này, Kiên sẽ hướng dẫn các bạn xử lí exception trong file global.asax.

Nếu bạn không muốn phải xử lí lỗi trong từng controller hay từng method, hoặc giả sử chúng ta bỏ sót không xử lí exception ở một nơi nào đó, hoặc chúng ta thích quản lý tập trung các exception, thì việc xử lí exception bằng cách khai báo method Application_Error trong file global.asax này khá là hữu dụng.

Ưu điểm khác là bạn có thể bắt tất cả các lỗi, đồng thời có thể thực hiện nhiều yêu cầu trong cùng một nơi. Ví dụ như khi có lỗi xảy ra, bạn muốn ghi log lại, đồng thời gửi mail hoặc thông báo đến admin, sau đó có thể redirect đến trang thông báo lỗi...

Cách thực hiện chức năng này khá đơn giản.

Đầu tiên chúng ta vào file global.asax và bổ sung thêm vào đó method Application_Error bởi vì ASP.NET MVC mặc định sẽ không có method này.

   public class MvcApplication : System.Web.HttpApplication  
   {  
     protected void Application_Start()  
     {  
       AreaRegistration.RegisterAllAreas();  
       GlobalConfiguration.Configure(WebApiConfig.Register);  
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
       RouteConfig.RegisterRoutes(RouteTable.Routes);  
       BundleConfig.RegisterBundles(BundleTable.Bundles);  
     }  

     void Application_Error(object sender, EventArgs e)  
     {  
       //get the last error of server  
       var error = Server.GetLastError();  

       //get the http code of error: 400, 404, 500...  
       var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;  

       //write log  

       //send email  

       //clear response stream  
       Response.Clear();  

       //clear server's error  
       Server.ClearError();  

       //redirect to error page  
       Response.Redirect(string.Format("~/Error/Index/{0}", code));  
     }  
   }  

Hãy nhìn vào Application_Error để biết những gì mà chúng ta cần phải làm:

1. Đầu tiên chúng ta lấy được lỗi mới xảy ra thông qua method Server.GetLastError. Đây có thể là bất kì lỗi nào chứ không nhất thiết chỉ là lỗi HttpException.
2. Khi đã bắt được lỗi thì việc tiếp theo là chúng ta có thể xử lí tùy ý. Ở đây Kiên sẽ ghi log lại để tiện trong việc tracking và đồng thời gửi mail đến cho mình.
3. Tiếp theo là chúng ta phải clear response stream để đảm bảo là tất cả nội dung được viết trong response phải được xóa hết.
4. Sau đó là chúng ta tiếp tục clear tất cả lỗi hiện tại đi.
5. Và cuối cùng là chúng ta sẽ điều hướng sang một trang mới dùng để hiển thị thông điệp cho người dùng, đồng thời truyền đi HTTP code để hiển thị thông tin phù hợp.

Bước tiếp theo là ta tạo ErrorController với action method có một tham số như bên dưới, và sau đó hãy nhớ add view cho nó.

   public class ErrorController : Controller  
   {  
     // GET: Error  
     public ActionResult Index(int id)  
     {  
       Response.StatusCode = id;  
       ViewBag.StatusCode = id;  
       return View();  
     }  
   }  

Vậy xem như chúng ta cơ bản đã hoàn thành việc xử lí lỗi thông qua Application_Error trong file global.asax. Hãy để lại comment bên dưới nếu bạn muốn trao đổi thêm!

Share to be shared!

No comments:

Post a Comment