8

Tüm özel durumları işlemek ve günlüğe kaydetmek için genel bir eylem filtresi kullanıyorum. o OnException yöntemini geçersiz kılar -ExceptionContext.ExceptionGandled değişiklikleri doğru. Özel durum nerede ele alınır?

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new ElmahHandleErrorAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 

Bu küresel eylem filtresi ElmahHandleErrorAttribute tanımlanır nasıl. OnException yöntemi çalıştırılır zaman context.ExceptionHandled değeri doğrudur neden

public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     //Is the exception handled already? context.ExceptionHandled seems to be true here 
     if (!context.IsChildAction && (context.HttpContext.IsCustomErrorEnabled)) 
     { 
      //Do other stuff stuff 
      //Log to Elmah    
     } 
    } 
    ... 
} 

anlamıyorum. Bu istisna nasıl ele alınır?

-EDIT-

Ben Web.Config bir customErrors bölümü var. Bir ErrorController sınıfım var ve General ve Http404 adlı eylemler var. ElmahHandleErrorAttribute başlar OnException yöntemi çalıştırırken, ancak ExceptionContext.ExceptionHandled değeri true olarak ayarlanır Ne (kesme noktası isabet asla), kontrolör eylem General yürütülmez olduğunu anlamıyorum

<customErrors mode ="On" defaultRedirect="Error/General"> 
     <error statusCode="404" redirect="Error/Http404"/> 
    </customErrors> 

.

+0

Kodunuzda 'context.ExceptionHandled' göremiyorum, nerede? – gdoron

+0

@gdoron context.ExceptionHandled için denetimi kaldırdım.Daha önce ifadeye dahil edildi: 'if (! Context.IsChildAction &&! Context.ExceptionHandled && (context.HttpContext.IsCustomErrorEnabled)) – escist

+0

Denetleyicinin' OnException' yöntemini geçersiz kıldınız mı? – gdoron

cevap

19

Bir istisna oluştuğunda, global filtrelerin sırası in reverse order'u çalıştırır. Bu, HandleErrorAttribute ilkinin çalıştırıldığı anlamına gelir.

Sen HandleErrorAttributehere kodunu görüntüleyebilir, ancak kısaca, bu: ExceptionHandled yanlıştır ve özel hatalar etkinse

  1. Sadece yürütür.
  2. Hata görünümüne, varsayılan olarak Error olarak adlandırılan bir yönlendirme kurar.
  3. ExceptionHandled değerini true olarak ayarlar.

ilk filtre var gibi o Hata görünümünü ayarlamak neden ve true ExceptionHandled ayarlayarak, çalıştırdığında sonra ExceptionHandled yanlıştır. Dolayısıyla, kendi filtreniz yürütüldüğünde, bu nedenle ExceptionHandled zaten doğru olarak ayarlanmış demektir. Özel hatalar devre dışı bırakılmışsa,öğesinin işini yapamayacağı için ExceptionHandled öğesinin hala yanlış olacağını unutmayın. Bu durumda, ELMAH hataya neden olur, işlenmediği için (ölümün sarı ekranı), böylece sınıfınızdaki sınama, hatanın yinelenen günlüğünü engellemektir. General eylem gerçekleştirildiğinde değil peynir altı hakkındaki diğer soruya filtreler bazı açık kendilerini yönlendirmek set yoksa

Şimdi, defaultRedirect sadece kullanılır, bu yüzden bir istisna bir ActionMethod ve iç oluştuğunda aslında göz ardı Global filtre HandleErrorAttribute kayıtlı. Bununla birlikte, mevcut olmayan bir URL'yi, yani bir ActionMethod içinde gerçekleşmeyen bir hatayı girdiyseniz, çağrılabilir. Ayrıca, Global.asax.cs içinde HandleErrorAttribute kaydını kaydetmek için bir satır eklediyseniz, her zaman General denetleyici eylemini gerçekleştirirsiniz.

+0

Açıklamanız için teşekkür ederiz. Bana gerçekten yardımcı oldu. ElmahHandleErrorAttribute'un çalıştırılan ilk filtre olmasını istiyorum. Bu özel filtrenin sırasını ayarlamak bunu düzeltir mi? Bu yoruma göre (http://stackoverflow.com/a/9163926/1242061) İlk önce yürütmek istediğim filtreye daha yüksek bir Sipariş değeri vermeliyim. – escist

+1

Evet, Order özelliğiyle oynayabileceğinizden şüpheleniyorum (ancak bunu genel bir filtrede nasıl gerçekleştirdiğinden emin değilsiniz, bunu yalnızca bir özellik olarak kullanırken yaptık). Sadece RegisterGlobalFilters uygulamasında filtreleri eklediğiniz sırayı tersine çevirmeniz gerekir ... bir hata oluştuğunda, en son eklenen ek önce çalışır. Neden önce ELMAH'ın çalışmasını istediğinize emin olamıyorsunuz ve gerçekten yapıyorsanız, bu durumda her zaman yanlış olacağından, ExceptionHandled'i kontrol edemezsiniz. –

+0

Filtreleri kaydederken siparişleri belirttim. Şimdi benim özel filtremiz 'ElmahHandleErrorAttribute' ilk hatayı ele alıyor. Sorunuzla ilgili olarak, neden ELMAH'ın neden ilk kaçını çalıştırmasını istediğinize emin olmayın, Bunun kötü bir fikir olduğunu mu düşünüyorsunuz? Bunu yapıyorum çünkü özel hata sayfalarını görüntülemek ve hata türünü kontrol etmek ve belirli bir görünümü görüntülemek istiyorum. – escist

İlgili konular