2013-10-02 34 views
5

Ben yazı keskin kullanarak arıyorum ve birkaç demoları bir araya getirmek çalışıyorum. Bunlardan biri istisnaları kaydedecek bir özellikti, diğeri ise null argümanları kontrol etmek ve biriyle karşılaşıldığında bir istisna atmaktı.postsharp ile yönlere yönlerini uygulama

Karşılaştığım sorun, null denetim yönü tarafından atılan özel durumları günlüğe kaydetmek için özel günlüğe kaydetme özelliğimi istemektir. Çalışmıyor gibi gözüküyor. Bu işi yapmanın bir yolu var mı?

DÜZENLEME: Açık olmak gerekirse, istisna logger bir yönünün dışında atılan istisnalar dışında çalışıyor, ancak yönüyle kontrol için null kod

aşağıdaki gibidir NullCheckAttribute

üzerinde thown istisnalar giriş isnt

[Serializable] 
public class NullCheckAttribute : OnMethodBoundaryAspect 
{ 
    [ExceptionLogger] 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     foreach (var argument in args.Arguments) 
     { 
      if (argument == null) 
       throw new InvalidOperationException("Null argument in " + args.Method.Name); 
     } 
    } 
} 

Ve istisna kaydedicisi

[Serializable] 
public class ExceptionLoggerAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     Console.WriteLine("Exception thrown in " + args.Method.Name); 
     Console.WriteLine("***Message: " + args.Exception.Message); 
     Console.WriteLine("***Stack trace: " + args.Exception.StackTrace); 
    } 
} 

için kod Ben de sadece özgür ruhsat için kullanıyorum bahsetmeliyiz bu.

+1

'Çalışıyor gibi görünmüyor. - tam olarak ne oluyor? – Muctadir

+0

İstisna kaydedici normal istisnalarla düzgün çalışıyor, ancak NullCheckAttribute öğesinde atılanlar günlüğe kaydediliyor. –

+0

'MethodExecutionArgs' gerçekten null olduğunu görmek için 'NullCheckAttribute' hata ayıklamadınız mı? – Muctadir

cevap

7

PostSharp, NullCheckAttribute sınıfında [ExceptionLogger] uygulayarak yapmaya çalıştığınız şey olan, bir sınıf sınıfında yönler uygulamanıza izin vermez.

Halihazırda, bir görünüm sınıfında bir özellik özelliği algılanırsa, sessizce göz ardı edilir. Bu şekilde davranır çünkü çoğu zaman bu uygulama kasıtsızdır (multicasting yoluyla).

İstenilen etkiyi elde etmenin doğru yolu (boş denetimden atılan istisnayı kaydet), her iki özniteliği de hedef yönteme uygulamaktır. Ayrıca, uygulanan özelliklerin sırasının önemli olduğunu unutmayın. Bu örnek için değiştirirseniz, günlük mesajınızı göremezsiniz - çünkü null check, istisna kaydedici tarafından başlatılan try/catchtan önce çalıştırılacaktır.

[ExceptionLogger(AspectPriority = 1)] 
    [NullCheck(AspectPriority = 2)] 
    private void TestMethod(string s) 
    { 
     Console.WriteLine(s); 
    } 
+0

Yardımlarınız için teşekkür ederim :) –

İlgili konular