ثبت استثناهای مدیریت شده توسط ELMAH
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

در مورد ELMAH پیشتر مطالبی در این سایت منتشر شده است:

از آن می‌توان جهت ثبت استثناهای مدیریت نشده در انواع و اقسام برنامه‌های وب دات نتی استفاده کرد. از برنامه‌های ASP.NET Webforms ، ASP.NET MVC تا سرویس‌های WCF ، WCF RIA و غیره. سپس این Http module ویژه امکان مرور خطاهای ثبت شده را از راه دور میسر می‌سازد، به همراه فید RSS از خطاها، امکان مشاهده‌ی مقادیر فیلدها در لحظه‌ی بروز خطا، ارسال ایمیل خطاها و امکان ذخیره سازی آن‌ها در فایل‌های XML تا انواع بانک‌های اطلاعاتی.
برای نمونه، سایت Stackoverflow از یک نمونه‌ی سفارشی شده‌ی آن استفاده می‌کند (+).

همانطور که در این معرفی آمده است : ثبت استثناهای "مدیریت نشده". اما آیا امکان ثبت استثناهای مدیریت شده هم توسط آن وجود دارد؟
پاسخ: بله. به صورت زیر:
...
}
catch (Exception ex)
{
   Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
... 
فقط کافی است ارجاعی به اسمبلی ELMAH اضافه شود و از سطر فوق استفاده گردد. به این صورت خروجی شبیه به همان خطاهای مدیریت نشده در لیست خطاهای ثبت شده توسط ELMAH ظاهر خواهد شد.

یک نکته‌ی تکمیلی
در یک سری از متدهای فایل global.asax عموما Context ای وجود ندارد (دقیقا مانند برنامه‌های دسکتاپ). در این حالت از روش زیر
 Elmah.ErrorLog.GetDefault(null).Log(new Error(ex))
استفاده کنید:
using System;
using System.Text;
using Elmah;

namespace Common.WebToolkit
{
    public static class ElmahLogEx
    {
        public static void LogException(this string ex)
        {
            if (string.IsNullOrWhiteSpace(ex))
                return;
            LogException(new Exception(ex));
        }

        public static void LogException(this Exception ex)
        {
            if (ex == null) return;
            try
            {
                ErrorSignal.FromCurrentContext().Raise(ex);
            }
            catch
            {
                ErrorLog.GetDefault(null).Log(new Error(ex));
            }
        }
    }
}
البته باید درنظر داشت که ماژول ارسال ایمیل‌های آن یک HttpModule است و  نیاز به HttpContext جاری را دارد تا کار کند. زمانیکه از ErrorLog.GetDefault(null) استفاده می‌شود، ایمیلی توسط آن ارسال نخواهد شد؛ چون درخواستی به این HttpModule نمی‌رسد.
  • #
    ‫۱۳ سال و ۱۰ ماه قبل، دوشنبه ۱۱ بهمن ۱۳۸۹، ساعت ۰۳:۱۲
    آیا سایت stackoverflow سورس بازه
    سورسشو از کجا می شه دانلود کرد؟
  • #
    ‫۱۳ سال و ۱۰ ماه قبل، دوشنبه ۱۱ بهمن ۱۳۸۹، ساعت ۰۴:۱۵
    نه. یا نه هنوز : (+)
    ولی دیتابیس سایتشون رو میشه دریافت کرد و هر ماه یک نسخه جدید ارائه می‌دن: (+)

    البته نسخه‌‌های مشابه نوشته شده : (+) و (+)
    و یک سایت ایرانی نمونه: (+)
  • #
    ‫۱۳ سال و ۹ ماه قبل، شنبه ۱۶ بهمن ۱۳۸۹، ساعت ۱۳:۵۶
    تکمیل این بحث: در یک سری از متدهای فایل global.asax عموما Context ایی وجود ندارد (دقیقا مانند برنامه‌های دسکتاپ). در این حالت از Elmah.ErrorLog.GetDefault(null).Log(new Error(ex)) استفاده کنید.
  • #
    ‫۱۰ سال و ۱۰ ماه قبل، شنبه ۱۴ دی ۱۳۹۲، ساعت ۱۶:۳۹
    با سلام.
    دستور فوق رو گذاشتم اما به ErrorLog_Logged یا Application_Error منتقل نشد. منظور از ارجاع به اسمبلی رو متوجه نشدم. میشه یک نمونه مثال بزنید.
    ممنون...
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، شنبه ۱۴ دی ۱۳۹۲، ساعت ۱۷:۰۱
      - بله؛ منتقل نمی‌شود به روال‌های رویدادگردان یاد شده. سطر یاد شده در متن فوق، صرفا خطای مدنظر را به لیست لاگ‌های قابل گزارشگیری ELMAH اضافه می‌کند.
      - Elmah یک فایل DLL دارد به نام Elmah.dll. به این فایل‌های DLL در دات نت، اصطلاحا اسمبلی گفته می‌شود. افزودن ارجاعی به اسمبلی، یعنی مراجعه به منوی پروژه در VS.NET و سپس انتخاب گزینه‌ی Add reference در آنجا و انتخاب DLL یاد شده.
      - در قسمت «مطالب مرتبط » ذیل هر بحث، یا حتی مقدمه‌ی بحث جاری، مثال‌های بیشتری ارائه شده‌اند.
  • #
    ‫۸ سال و ۸ ماه قبل، یکشنبه ۱۸ بهمن ۱۳۹۴، ساعت ۱۵:۳۱
    باتشکر؛
    با توجه به این که لایه‌های زیرین میبایست با Message با لایه بالاتر در ارتباط باشند و این خطاها در لایه بالاتر لاگ شوند ؛آیا ارجاع به اسمبلی Elmah در DataLayer کار درستی میباشد. برای مثال در یک برنامه Asp.net MVC برای نمایش خطاهای همزمانی به شکل زیر عمل کردن موردی ندارد؟
    public async Task<string> SaveAllChangesAsync(bool invalidateCacheDependencies = true, Guid? auditUserId = null)
            {
                try
                {
                    if (auditUserId.HasValue)
                        AuditFields(auditUserId.Value);
                    await SaveChangesAsync();
                    if (!invalidateCacheDependencies) return string.Empty;
                    var changedEntityNames = GetChangedEntityNames();
                    new EFCacheServiceProvider().InvalidateCacheDependencies(changedEntityNames);
                }
                catch (DbUpdateConcurrencyException ex)
                {
                    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                    return ConcurrencyMessage;
                }
                return string.Empty;
            }

    • #
      ‫۸ سال و ۸ ماه قبل، یکشنبه ۱۸ بهمن ۱۳۹۴، ساعت ۱۵:۵۷
      در مطلب «نکات کار با استثناءها در دات نت» به این موارد بهتر پرداخته شده‌است:
      «... در واقع استثنا‌ها حالت‌هایی هستند که غیرقابل پیش‌بینی هستند. این حالت‌ها می‌توانند یک خطای منطقی از طرف برنامه‌نویس و یا چیزی خارج کنترل برنامه‌نویس باشند (مانند خطاهای سیستم‌عامل، شبکه، دیسک). یعنی در بیشتر مواقع این نوع خطاها را نمی‌توان مدیریت کرد ...»
      و یا
      « ... در واقع استثناء‌ها بستگی به حالت‌های مختلفی دارد. در مثال اول وجود فایل حیاتی است ولی در حالت دوم بدون وجود فایل نیز برنامه می‌تواند به کار خود ادامه داده و فایل مورد نظر را از نو ایجاد کند ...»

      بنابراین «حیاتی بودن» یک شرط در حال بررسی، معیاری هست برای صدور استثناء یا مدیریت آن. اگر حیاتی است، باید در همان نقطه کار خاتمه پیدا کند، استثناء مدیریت نشود و یا استثنایی مشخص صادر شود ( fail fast ).