Anasayfa / Asp.NET / ASP.NET MVC Hata Yönetimi (Exception Handling)

ASP.NET MVC Hata Yönetimi (Exception Handling)

Geliştirdiğimiz her projelerde kod hatalarını bir noktadan yönetme ihtimali her zaman vardır. Bu hatalar bizden kaynaklı veya tahmin edemediğimiz durumlarda ortaya çıkabilir. Bu gibi durumlarda hatanın kaynağının direkt olarak son kullanıcıya gösterilmesi görsellik açısından hoş bir durum değildir, hem de projemizdeki bazı kodların son kullanıcıya gösterilmesine yani güvenlik zaafiyetine yol açabilir.  Kullanıcı projemizde var olmayan bir adrese gidebilir. Bu nedenle projede meydana gelebilecek herhangi bir hatayı merkezi olarak yönetebilmemiz gerekmektedir. ASP.NET bu amaçla etkili bir hata yönetimi (error handling) sunmaktadır. Uygulamamızda tüm request ve response’lerin yönetildiği, bunlara ait event’ların yakalandığı Global.asax dosyasında uygulamanın herhangi bir bölümünde herhangi bir kaynaktan dolayı meydana gelen hataların yakalanacağı Application_Error() metodunu kullanabiliriz. Bu metodu kullanarak herhangi bir hata meydana geldiğinde ASP.NET’in tipik hata sayfalarını göstermek yerine özel hata sayfalarımızı kullanıcılara gösterebiliriz. Bu sayede uygulamada oluşan hataları veritabanına yazdırabilir veya farklı loglama türleri kullanılabilir.

Global.asax
protected void Application_Error()
{
    var exception = Server.GetLastError(); //Oluşan hatayı değişkene atadık.
    //Eğer hata kaydı (log) tutulacak ise gerekli kodlar buraya.
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError(); //Sunucudaki hatayı temizleme.
    Response.TrySkipIisCustomErrors = true; //IIS'in tipik hata sayfalarını görmezden geldik.
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error"; //Hata mesajlarını yöneteceğimiz Controller ismi
    routeData.Values["action"] = "Index"; //Controller içindeki default Action ismi
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
 
    if (httpException != null)
    {
        Response.StatusCode = httpException.GetHttpCode();
 
        switch (Response.StatusCode)
        {
            case 403: //Eğer 403 hatası meydana gelmiş ise Http403 Action'ı devreye girecek.
                routeData.Values["action"] = "Http403";
                break;
 
            case 404: //Eğer 404 hatası meydana gelmiş ise Http404 Action'ı devreye girecek.
                routeData.Values["action"] = "Http404";
                break;
        }
    }
 
    IController errorsController = new Controllers.ErrorController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorsController.Execute(rc);
}

Yakalanan hataları kullanıcılara gösterebilmemiz için Model, Controller ve View’ı oluşturalım.

ErrorModel
public class ErrorModel
{
    public string ErrorTitle { get; set; }
    public Exception ExceptionDetail { get; set; }
}
ErrorController
public class ErrorController : Controller
{
     public ViewResult Index(Exception exception)
     {
        return View("Error", new ErrorModel { ErrorTitle = "Bir Hata Meydana Geldi", ExceptionDetail = exception });
     }
 
     public ViewResult Http404()
     {
       return View("Error", new ErrorModel { ErrorTitle = "Sayfa Bulunamadı" });
     }
 
     public ViewResult Http403()
     {
        return View("Error", new ErrorModel { ErrorTitle = "Yasaklı içerik" });
     }
}
View
@model MvcApplication1.Models.ErrorModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = Model.ErrorTitle;
}
 
@if (Response.StatusCode == 404)
{
    <img src="/content/images/error/404.png" alt="Sayfa Bulunamadı" />
}
else
{
    if (Model.ExceptionDetail != null)
    {
        @Model.ExceptionDetail.Message
    }
}