ASP.NET MVC ile tüm exceptionları yakalayıp nasıl yönlendirebilirim? yani genel anlamda hata yönetimi ve loglama nasıl yapılır?

soruldu: 19 Tem '14, 16:32

ercet00ilk's gravatar image

ercet00ilk
994435662
cevap kabul oranı: 11%


Bir yöntem @SaRPaRDa ' ın dediği gibi, mevcut hata yakalama metodunu override edip, o metod içerisinde hatayı yakalayıp loglayabilirsiniz.

Ortak bir controller oluşturup (örneğin; BaseController), bu controller sınıfının OnException metodunu override edip, diğer tüm controller sınıflarını bu BaseController sınıfından kalıtım alacak şekilde tanımlarsanız, tüm controller sınıflarınınız, exception handling özelliği olmuş olur.

protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext.ExceptionHandled)
        return;

    // oluşan hatayı view de göstermek için bir tempdata nesnesine atabiliriz.
    filterContext.Controller.TempData["Exception"] = filterContext.Exception;

    // hata oluştuğunda yönlendirilecek sayfa
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
        new { controller = "Exception", action = "HandleError" }));

    // başka hata yakalama işlemi varsa durdur
    filterContext.ExceptionHandled = true;

    // cevap üzerindeki diğer herşeyi sil
    filterContext.HttpContext.Response.Clear();

    base.OnException(filterContext);
}

Yukarıdaki kodu ajax request için aşağıdaki gibi de yazabilirsiniz.

...
    // eğer istek ajax ile olursa
    if (IsAjax(filterContext))
    {
        // oluşan hatayı view de göstermek için bu kez bir json veri döndürüyoruz
        filterContext.Result = new JsonResult(){Data=filterContext.Exception.Message,
            JsonRequestBehavior=JsonRequestBehavior.AllowGet};

        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();    
    }
    else
    {
        ...
        base.OnException(filterContext);           
    }
...

Diğer bir yöntem ise, ELMAH veya Log4Net kullanmak.

Elmah için Türkçe kaynak.

Elmah için İngilizce kaynak.

Log4Net için Türkçe kaynak.

Log4Net için İngilizce kaynak.

permanent link

cevaplandı: 21 Tem '14, 01:02

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

değiştirildi: 22 Tem '14, 04:47

codeproject'teki bu çözüm 4,87/5 puan almış. Her türlü hata yakalama tipinde örnekler vermiş.

permanent link

cevaplandı: 20 Tem '14, 22:42

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

bir de benden olsun.

(bir hatanın birden fazla detayı olması durumunda)

          try
            {
               //Bla bla
            }
            catch (Exception Ex)
            {
                Exception raise = Ex;
                foreach (var validationErrors in Ex.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        string message = string.Format("{0}:{1}", 
                            validationErrors.Entry.Entity.ToString(),
                            validationError.ErrorMessage);
                        // raise a new exception nesting
                        // the current instance as InnerException
                        raise = new InvalidOperationException(message, raise);
                    }
                }

            }
permanent link

cevaplandı: 15 Oca '15, 09:59

ercet00ilk's gravatar image

ercet00ilk
994435662
cevap kabul oranı: 11%

Cevabınız
toggle preview

powered by BitNami OSQA