این سایت برای ie9 طراحی نشده است

لطفا دستگاه خود را بچرخانید.

پیاده سازی ExceptionHandling با معماری AOP

۲۸ مهر ۱۳۹۴ نگین ربیعی
بدون دیدگاه

هدف این مقاله پیاده سازی ExceptionHandling بوسیله (Aspect-oriented programming (AOP است ، برای شروع نیاز به نصب

  • Visual Studio
  • PostSharp

داریم .در قدم اول یک پروژه Console Application میسازیم و بعد PostSharp، Refference رو به پروژه اضافه می کنیم .

using System;
using Common.Aspects;
 
namespace AspectExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ThrowSampleExecption();
        }
 
        private static void ThrowSampleExecption()
        {
            throw new ApplicationException("Sample Exception");
        }
    }
}

در حال حاضر یک exception بصورت نمونه داریم باید ببینیم که این خطا را چگونه باید catch کنیم و سپس آنرا log کنیم .

کلاسی به نام ExceptionAspect ایجاد می کنیم ، این کلاس از کلاس OnExceptionAspect ارث بری می کند . در داخل کلاس کدهای زیر را اضافه می کنیم .

 

    [Serializable]
    public class ExceptionAspect : OnExceptionAspect
    {
        public String Message { get; set; }
 
        public Type ExceptionType { get; set; }
 
        public FlowBehavior Behavior { get; set; }
 
        public override void OnException(MethodExecutionArgs args)
        {
            string msg = DateTime.Now + ": " + Message + Environment.NewLine;
            msg += string.Format("{0}: Error running {1}. {2}{3}{4}", DateTime.Now, args.Method.Name, args.Exception.Message, Environment.NewLine, args.Exception.StackTrace);
            Debug.WriteLine(msg);
            args.FlowBehavior = FlowBehavior.Continue;
        }
 
        public override Type GetExceptionType(System.Reflection.MethodBase targetMethod)
        {
            return ExceptionType;
        }
    }

خصوصیات Message ,ExceptionTypeو Behavior رو که از جنس FlowBehavior است رو اضافه کردیم (FlowBehavior در زمان ایجاد خطا مشخص می کند که چه عملی باید صورت بگیره ، در حالت عادی FlowBehavior بصورت Default است.)

متد OnException را override می کنیم ، exception پارامتر ورودی این متد است و پیغام خطایی که میخواهیم log شود رو در قسمت بعد میسازیم .

این پیغام خطارا به هر صورت که می خواهیم log  میکنیم و FlowBehavior رو Continue میکنیم که اجرای کد بدون توقف صورت بگیرد.

متد GetExceptionType را نیز override کرده و تایپ  Exception را از طریق این متد بر میگردانیم .

 

[ExceptionAspect(ExceptionType = typeof(ApplicationException), Message = "An example exception.", Behavior = FlowBehavior.Continue)]
       private static void ThrowSampleExecption()
       {
           throw new ApplicationException("Sample Exception");
       }

دربالای این متد در داخل براکت ()ExceptionAspect راقرار میدهیم (نیازی به ارسال پارامترهای ورودی نیست)

با این کار قبل از رسیدن به لایه Application خطا را مدیریت کرده و مانع توقف اجرای برنامه می شویم و همچنین می توانیم خطای ایجاد شده را log کرده و پیغام خطارا نیز داشته باشیم .

ما درپکیج ناگتی که در قسمت قبل ساخت آنرا توضیح دادیم از  AOP استفاده کردیم بدینصورت که پس از نصب پکیج ناگت و PostSharp با قراردادن [()ExceptionAspect] در بالای متدی که احتمال بروز خطا را دارد می توانیم  فایل notepad ای کنار پروژه خود ایجاد کرده و خطای پروژه را log کنیم  و در ادامه  ایمیلی برای ما فرستاده میشود .

برای آشنایی بیشتر با Aspect-Oriented Programming به این آدرس مراجعه کنید.