2009-08-18 17 views
6

Exception.Data özelliğinin değerlerini günlüğe yazmak için Exception Handling Application Block'u (EHAB) nasıl alabilirim?Exception.Data bilgileri EntLib günlüğünde yok

try 
    { 
    // ... 
    } 
    catch (Exception ex) 
    { 
    ex.Data.Add("Hello", "World"); 
    throw ex; 
    } 

istisna doğru kaydedilir ama ben bir yere Ehab tarafından oluşturulan günlük girişinde eklenen verileri bulmak mümkün değil.

Anladığım kadarıyla, yukarıdaki örnekte olduğu gibi istisna ile ilgili ek bilgileri eklemek önerilen bir uygulamadır. İşte bu yüzden EHAB'ın bunu varsayılan olarak içermediğine biraz şaşırdım.

Şablonu, EntLib Text Formatter Şablon Düzenleyicisi ile değiştirerek (aşağıdaki ekran görüntüsü) bu sorunu giderebilir miyim? Sağlanan çeşitli "jetonlar" hakkında hiçbir bilgi bulamıyorum, ama cevabın onlarla bir yerlerde saklı olduğunu farz ediyorum.

Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png

Ya ben gerçekten bunu gerçekleştirmek için kendi özel Metin Formatter uygulaması gerekir mi?

DÜZENLEME/GÜNCELLEME: benim kodunda her yerde HandleException yöntemi çağrısı eklemek zorunda kalmamak için benim Global.asax.cs bunu

:

using EntLib = Microsoft.Practices.EnterpriseLibrary; 
using System; 

namespace MyApp 
{ 
    public class Global : System.Web.HttpApplication 
    { 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // I have an "All Exceptions" policy in place... 
     EntLib.ExceptionHandling.ExceptionPolicy.HandleException(Server.GetLastError(), "All Exceptions"); 
     // I believe it's the GetLastError that's somehow returning a "lessor" exception 
    } 
    } 
} 

Bu çıkıyor bu aynı değil olduğunu (iyi çalışır ki, ve esasen benim sorunu çözer):

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("Hello", "World"); 
    bool rethrow = ExceptionPolicy.HandleException(ex, "Log Only Policy"); 
    throw ex; 
} 

Tüm kodun içinden geçiyor ve bir catchException çağrısı ile try-catch'lar eklemek sadece ... iyi, aptalca görünüyor. Sanırım problemim, 'un EHAB'yi doğru şekilde nasıl yapılandırılacağıdır.

'u düzgün bir şekilde nasıl yapabilirim Herhangi bir öneri, bir ASP.NET web uygulamasında "genel düzeyde" tüm istisnaları günlüğe kaydeder ??

+0

HandleException ile aynı fikirdeyim: bir çerçeve olarak, "eğer" eğer "eğer", "tasarım", gerçekten çok fazla soyutlama sunmuyor; Her catch bloğundaki "eğer" rehine "kodu" ile kodunuzu silmeniz gerekir. –

cevap

7

Kendi biçimlendiricinizi oluşturmanız gerekmez.

Exception nesnesindeki Data IDictionary içindeki her bir öğe LogEntry nesnesinin ExtendedProperties Sözlüğüne eklenir ve (biçimlendirici tarafından belirtilmişse) günlüğe kaydedilir.

Genişletilmiş Özellikler: {dictionary ({key} - {value})} config snippet'i genişletilmiş özellikler sözlüğündeki tüm anahtar/değer çiftlerini günlüğe kaydetmelidir. Koleksiyondan sadece bir öğe kaydetmek istiyorsanız "keyvalue" yi kullanabilirsiniz. Örnekte bu çizgisinde bir şey olurdu: Data.Add ("Merhaba", "Dünya") eklemek için

Hello Key: {keyvalue(Hello)} 


Değiştirilmiş ExceptionHandlingWithLoggingQuickStart ve ben ": - Dünya Merhaba Genişletilmiş Özellikler" bakın Olay Günlüğü girdisinin sonunda. Yani çalışıyor. o davranışı görmüyorsanız

, sen sağlamak için gereken:

eklenen Veri öğeleri ile istisna ExceptionPolicy için geçilen O
  • .HandleException yönteminde belirtilen politika LoggingConfiguration belirtilen biçimlendirici ExtendedProperties


Mümkünse desteklemek üzere yapılandırılmış O konfigürasyonu

  • bir LoggingExceptionHandler ile giriş için yapılandırılmış That HandleException
  • Sorunun ne olduğunu QuickStart'taki şeylerle karşılaştırdığınızı görüyoruz. Hala çalışmıyorsa, kodunuzu ve yapılandırmanızı gönderin.

    GÜNCELLEME:

    sayfa hatası idare etmedi çünkü o zaman bir HttpUnhandledException alınacak Global.asax içinde Application_Error işlemek için gidiyoruz. İlgilendiğiniz İstisna'yı InnerException özelliğini kullanarak alabilirsiniz; InnerException, özgün özel durumu içerecektir (bu özel durumun InnerException içinde olmadığı sürece :)). Alternatif olarak, kök neden olan istisnayı geri almak için Server.GetLastError().GetBaseException()'u kullanabilirsiniz.

  • +0

    Teşekkürler! Cevabınız şu ana kadar SO üzerinde kazandığım en iyi şeylerden biri. Kesin ve noktaya. Çok kötü, size sadece +1 verebiliyorum ve bu konunun fazla ilgi göstermediğini. Daha fazlasını hak ediyorsun. :) QuickStart'ı denedim ve hatta kendi yapılandırmamı örneklemle değiştirdim. Sonra sorunun ne olduğunu anladım: Soruyu güncelledim ve umarım bu konuda bana da yardım edebilirsin. –

    İlgili konular