ASP.NET MVC [HandleError] विशेषता के साथ काम करने के लिए ELMAH कैसे प्राप्त करें?


564

मैं अपने ASP.NET MVC एप्लिकेशन में त्रुटियों को लॉग इन करने के लिए ELMAH का उपयोग करने का प्रयास कर रहा हूं, हालांकि जब मैं अपने नियंत्रकों पर [हैंडललीयर] विशेषता का उपयोग करता हूं तो उनके होने पर ELMAH किसी भी त्रुटि को लॉग नहीं करता है।

जैसा कि मैं इसका अनुमान लगा रहा हूं क्योंकि ELMAH केवल बिना त्रुटि के लॉग करता है और [HandleError] विशेषता त्रुटि को संभाल रही है, इसलिए इसको लॉग करने की आवश्यकता नहीं है।

मैं कैसे संशोधित करूं या मैं उस विशेषता को संशोधित करने के बारे में कैसे कहूंगा ताकि ELMAH जान सके कि कोई त्रुटि थी और उसे लॉग इन करें।

संपादित करें: मुझे यह सुनिश्चित करने दें कि हर कोई समझता है, मुझे पता है कि मैं उस विशेषता को संशोधित कर सकता हूं जिस प्रश्न को मैं नहीं पूछ रहा हूं ... ईएलएमएएच को संभाल लिया जाता है जब हैंडिलर विशेषता का उपयोग करते हुए इसका अर्थ है कि यह नहीं देखेगा कि कोई त्रुटि थी क्योंकि इसे संभाला गया था पहले से ही विशेषता ... मैं जो पूछ रहा हूं, उसमें एएलएमएएच को त्रुटि देखने का एक तरीका है और इसे लॉग इन करें, भले ही विशेषता ने इसे संभाला हो ... मैंने आसपास खोज की और कॉल करने के लिए इसे मजबूर करने के लिए कॉल करने के लिए कोई विधियां नहीं देखीं। त्रुटि....


12
वाह, मुझे उम्मीद है कि जेफ या जेरेड इस सवाल का जवाब देंगे। वे Stackoverflow के लिए ELMAH का उपयोग कर रहे हैं;)
जॉन लीमजाप

11
हम्म, अजीब - हम हैंडलेयर एट्रिब्यूट का उपयोग नहीं करते हैं - एल्माह हमारे वेब.कॉन्फिग के <मॉड्यूल> अनुभाग में सेटअप है। क्या HandleErrorAttribute का उपयोग करने के कुछ लाभ हैं?
जारोड डिक्सन

9
@Jarrod - यह देखना अच्छा होगा कि आपके ELMAH कांटे के बारे में "कस्टम" क्या है।
स्कॉट हंसेलमैन

3
@dswatik आप redirectMode को Web.config में ResponseRewrite पर पुनर्निर्देशित करके भी रोक सकते हैं। ब्लॉग
Pavel Chuchuva

6
मैं वेब दस्तावेज़ और पोस्ट [हैंडलेयर] विशेषता और एल्माह के बारे में बात करता रहा, लेकिन जब मैंने डमी केस को सेटअप किया, तो मुझे यह हल नहीं मिला (जैसे एल्माह "संभाले हुए" त्रुटि को लॉग नहीं कर रहा था)। ऐसा इसलिए है क्योंकि Elmah.MVC 2.0.x के रूप में इस कस्टम हैंडलेयरआर्ट श्रद्धांजलि की अब आवश्यकता नहीं है; यह नगेट पैकेज में शामिल है।
प्लाइवन

जवाबों:


503

आप HandleErrorAttributeइसके OnExceptionसदस्य को कॉपी और ओवरराइड कर सकते हैं (कॉपी करने की कोई आवश्यकता नहीं है) ताकि यह ईएलएमएएच के साथ अपवाद को लॉग करे और केवल तभी जब आधार कार्यान्वयन इसे संभालता है। आपके लिए आवश्यक कोड की न्यूनतम राशि इस प्रकार है:

using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled) 
            return;
        var httpContext = context.HttpContext.ApplicationInstance.Context;
        var signal = ErrorSignal.FromContext(httpContext);
        signal.Raise(context.Exception, httpContext);
    }
}

आधार कार्यान्वयन पहले लागू किया जाता है, जिससे इसे अपवाद के रूप में चिह्नित करने का मौका मिलता है। इसके बाद ही इसका संकेत दिया गया है। उपरोक्त कोड सरल है और ऐसे मुद्दों का कारण बन HttpContextसकता है, जिनका उपयोग ऐसे वातावरण में किया जा सकता है जहां परीक्षण उपलब्ध नहीं हो सकता है। नतीजतन, आप ऐसा कोड चाहेंगे जो अधिक रक्षात्मक हो (थोड़े अधिक समय तक रहने पर):

using System.Web;
using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled       // if unhandled, will be logged anyhow
            || TryRaiseErrorSignal(context) // prefer signaling, if possible
            || IsFiltered(context))         // filtered?
            return;

        LogException(context);
    }

    private static bool TryRaiseErrorSignal(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        if (httpContext == null)
            return false;
        var signal = ErrorSignal.FromContext(httpContext);
        if (signal == null)
            return false;
        signal.Raise(context.Exception, httpContext);
        return true;
    }

    private static bool IsFiltered(ExceptionContext context)
    {
        var config = context.HttpContext.GetSection("elmah/errorFilter")
                        as ErrorFilterConfiguration;

        if (config == null)
            return false;

        var testContext = new ErrorFilterModule.AssertionHelperContext(
                              context.Exception, 
                              GetHttpContextImpl(context.HttpContext));
        return config.Assertion.Test(testContext);
    }

    private static void LogException(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        var error = new Error(context.Exception, httpContext);
        ErrorLog.GetDefault(httpContext).Log(error);
    }

    private static HttpContext GetHttpContextImpl(HttpContextBase context)
    {
        return context.ApplicationInstance.Context;
    }
}

यह दूसरा संस्करण पहले ईएलएमएएच से त्रुटि सिग्नलिंग का उपयोग करने की कोशिश करेगा , जिसमें लॉगिंग, मेलिंग, फ़िल्टरिंग और आपके पास क्या है जैसे पूरी तरह से कॉन्फ़िगर पाइपलाइन शामिल है। असफल होना, यह देखने का प्रयास करता है कि त्रुटि को फ़िल्टर किया जाना चाहिए या नहीं। यदि नहीं, तो त्रुटि बस लॉग की गई है। यह कार्यान्वयन मेल सूचनाओं को संभालता नहीं है। यदि अपवाद को संकेत दिया जा सकता है तो ऐसा करने के लिए कॉन्फ़िगर किए जाने पर एक मेल भेजा जाएगा।

आपको यह भी ध्यान रखना पड़ सकता है कि यदि कई HandleErrorAttributeउदाहरण प्रभावी हैं तो डुप्लिकेट लॉगिंग नहीं होती है, लेकिन उपरोक्त दो उदाहरणों को आपकी शुरुआत मिलनी चाहिए।


1
अति उत्कृष्ट। मैं एल्म को लागू करने की कोशिश नहीं कर रहा था। मैं बस अपनी खुद की त्रुटि रिपोर्टिंग को हुक करने की कोशिश कर रहा था जो मैंने वर्षों से एक तरह से उपयोग किया है जो एमवीसी के साथ अच्छी तरह से काम करता है। आपके कोड ने मुझे एक प्रारंभिक बिंदु दिया। +1
स्टीव वॉर्थम

18
आपको HandleErrorAttribute को उप-करने की आवश्यकता नहीं है। आप बस एक IExceptionFilter कार्यान्वयन है और यह HandleErrorAttribute के साथ एक साथ पंजीकृत हो सकता है। इसके अलावा मुझे नहीं मिलता कि आपको ErrorSignal.Raise (..) के मामले में फेलबैक की आवश्यकता क्यों है। यदि पाइपलाइन बुरी तरह से कॉन्फ़िगर की गई है, तो इसे ठीक किया जाना चाहिए। 5 लाइनर IExceptionFilter चेक पॉइंट 4 के लिए। यहाँ - ivanz.com/2011/05/08/…
इवान ज़्लाटेव

5
कृपया नीचे दिए गए उत्तर पर आप @IZZlatev द्वारा प्रयोज्यता, कमियों आदि के संबंध में टिप्पणी कर सकते हैं। लोग टिप्पणी कर रहे हैं कि यह आसान / छोटा / सरल है और आपके उत्तर के समान ही प्राप्त करता है और जैसे कि सही उत्तर के रूप में चिह्नित किया जाना चाहिए। इस पर अपना दृष्टिकोण रखना और इन उत्तरों के साथ कुछ स्पष्टता प्राप्त करना अच्छा होगा।
एंड्रयू

7
क्या यह अभी भी प्रासंगिक है या ELMAH.MVC इसे संभालता है?
रोमियों

2
यहां तक ​​कि मैं यह जानना चाहूंगा कि क्या यह आज के संस्करण में भी प्रासंगिक है
रिफ्लेक्टर

299

क्षमा करें, लेकिन मुझे लगता है कि स्वीकृत उत्तर एक ओवरकिल है। आपको बस इतना करना है:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

और फिर इसे दर्ज करें (आदेश महत्वपूर्ण है) Global.asax.cs में:

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

3
+1 बहुत अच्छा, विस्तार करने के लिए कोई ज़रूरत नहीं HandleErrorAttribute, ओवरराइड करने के लिए कोई जरूरत OnExceptionपर BaseController। यह स्वीकार किए गए उत्तर के लिए माना जाता है।
CallMeLaNN

1
@bigb मुझे लगता है कि आपको अपवाद संदेश में चीजों को जोड़ने के लिए अपने स्वयं के अपवाद प्रकार में अपवाद को लपेटना होगा, आदि (जैसे new UnhandledLoggedException(Exception thrown)जो Messageइसे वापस करने से पहले कुछ जोड़ता है ।
इवान ज़्लैटेव

23
आतिफ अजीज ने
ईएलएमएएच

48
@jamiebarrow मुझे इस बात का अहसास नहीं था, लेकिन उनका जवाब ~ 2 साल पुराना है और शायद इस सवाल के इस्तेमाल के मामलों को कम आत्म-निहित तरीके से समर्थन देने के लिए एपीआई को सरल बनाया गया है।
इवान ज़्लाटेव

6
@ इवन ज़लेटेव वास्तव में काम नहीं कर सकते हैं ElmahHandledErrorLoggerFilter()एल्माह बस लॉगिंग किए गए त्रुटियों को लॉगिंग करते हैं, लेकिन संभाला नहीं। मैंने सही क्रम में फ़िल्टर पंजीकृत किया है जैसा कि आपने उल्लेख किया है, कोई विचार?
कुंसविक.देव।

14

अब NuGet में एक ELMAH.MVC पैकेज है जिसमें आतिफ द्वारा एक बेहतर समाधान शामिल है और एक नियंत्रक भी है जो MVC रूटिंग के भीतर एल्माह इंटरफ़ेस को संभालता है (अब उस अक्ष का उपयोग करने की कोई आवश्यकता नहीं है)
उस समाधान के साथ समस्या (और यहां सभी के साथ) ) यह है कि एक तरह से या किसी अन्य एल्मा त्रुटि हैंडलर वास्तव में त्रुटि को संभाल रहा है, जिसे आप एक कस्टम टैग के रूप में या ErrorHandler या अपने स्वयं के त्रुटि हैंडलर के माध्यम से सेट करना चाह सकते हैं की अनदेखी कर रहे हैं।
सबसे अच्छा समाधान IMHO एक फिल्टर बनाना है जो अन्य सभी फिल्टर के अंत में कार्य करेगा और उन घटनाओं को लॉग करेगा जो पहले से ही नियंत्रित की गई हैं। एल्माह मॉड्यूल को अन्य त्रुटियों को लॉग करने में ध्यान रखना चाहिए जो एप्लिकेशन द्वारा अनहेल्ड हैं। यह आपको स्वास्थ्य मॉनिटर और अन्य सभी मॉड्यूल का उपयोग करने की अनुमति देगा, जो त्रुटि घटनाओं को देखने के लिए asp.net में जोड़ा जा सकता है

मैं elmah.mvc के अंदर ErrorHandler पर परावर्तक के साथ यह देख लिखा था

public class ElmahMVCErrorFilter : IExceptionFilter
{
   private static ErrorFilterConfiguration _config;

   public void OnException(ExceptionContext context)
   {
       if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
       {
           var e = context.Exception;
           var context2 = context.HttpContext.ApplicationInstance.Context;
           //TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
           if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
           {
            _LogException(e, context2);
           }
       }
   }

   private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
   {
       if (_config == null)
       {
           _config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
       }
       var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
       return _config.Assertion.Test(context2);
   }

   private static void _LogException(System.Exception e, System.Web.HttpContext context)
   {
       ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
   }


   private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
   {
       var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
       if (signal == null)
       {
           return false;
       }
       signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
       return true;
   }
}

अब, आपके फ़िल्टर कॉन्फ़िगर में आप कुछ ऐसा करना चाहते हैं:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //These filters should go at the end of the pipeline, add all error handlers before
        filters.Add(new ElmahMVCErrorFilter());
    }

ध्यान दें कि मैंने लोगों को यह याद दिलाने के लिए एक टिप्पणी छोड़ी है कि यदि वे एक वैश्विक फ़िल्टर जोड़ना चाहते हैं जो वास्तव में अपवाद को हैंडल करेगा तो इसे इस अंतिम फ़िल्टर से पहले जाना चाहिए, अन्यथा आप उस मामले में भाग लेते हैं जहां अनचाहे अपवाद को ElmahnVCVrrorFilter द्वारा अनदेखा किया जाएगा। इसे संभाला नहीं गया है और इसे एल्माह मॉड्यूल द्वारा लॉग किया जाना चाहिए लेकिन फिर अगला फ़िल्टर अपवाद को संभालता है और मॉड्यूल इसे अनदेखा करता है, जिसके परिणामस्वरूप अपवाद इसे एल्माह में कभी नहीं बनाता है।

अब, सुनिश्चित करें कि आपके webconfig में एल्माह के लिए एप्लेटिंग कुछ इस तरह दिखें:

<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->

यहां एक महत्वपूर्ण "elmah.mvc.disableHandleErrorFilter" है, अगर यह गलत है तो यह elmah.mvc के अंदर हैंडलर का उपयोग करेगा जो वास्तव में डिफ़ॉल्ट हैंडलेयरहैंडलर का उपयोग करके अपवाद को हैंडल करेगा जो आपकी कस्टम सेटिंग्स को अनदेखा करेगा

यह सेटअप आपको वर्गों और विचारों में अपना स्वयं का ErrorHandler टैग सेट करने की अनुमति देता है, जबकि एल्माहमवीवीसीआर-फ़ोरफ़िल्टर के माध्यम से उन त्रुटियों को लॉग इन करते हुए, एल्म मॉड्यूल के माध्यम से अपने web.config में एक कस्टम कॉन्फ़िगरेशन को जोड़ते हुए, यहां तक ​​कि अपने स्वयं के त्रुटि हैंडलर भी लिख सकते हैं। केवल एक चीज जो आपको करने की आवश्यकता है, वह है कि किसी भी फ़िल्टर को न जोड़ना याद रखें जो वास्तव में एल्मह फिल्टर से पहले त्रुटि को संभालेंगे। और मैं उल्लेख करना भूल गया: एल्माह में कोई डुप्लिकेट नहीं।


7

आप ऊपर दिए गए कोड को ले सकते हैं और एक कस्टम नियंत्रक कारखाना शुरू करके एक कदम आगे बढ़ सकते हैं जो हर नियंत्रक में HandleErrorWithElmah विशेषता को इंजेक्ट करता है।

अधिक जानकारी के लिए MVC में लॉगिंग पर मेरी ब्लॉग श्रृंखला देखें। पहला लेख एल्माह की स्थापना और MVC के लिए चल रहा है।

लेख के अंत में डाउनलोड करने योग्य कोड के लिए एक लिंक है। उम्मीद है की वो मदद करदे।

http://dotnetdarren.wordpress.com/


6
मुझे लगता है कि यह एक आधार नियंत्रक वर्ग पर बस छड़ी करने के लिए एक बहुत आसान होगा!
नाथन टेलर

2
लॉगिंग और अपवाद हैंडलिंग पर ऊपर डैरेन की श्रृंखला अच्छी तरह से पढ़ने लायक है !!! बहुत गहन!
रयान एंडरसन

6

मैं ASP.NET MVC में नया हूँ। मुझे उसी समस्या का सामना करना पड़ा, मेरे Erorr.vbhtml में मेरा काम करने योग्य है (यह काम करता है यदि आपको केवल एल्माह लॉग का उपयोग करके त्रुटि लॉग करने की आवश्यकता है)

@ModelType System.Web.Mvc.HandleErrorInfo

    @Code
        ViewData("Title") = "Error"
        Dim item As HandleErrorInfo = CType(Model, HandleErrorInfo)
        //To log error with Elmah
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(New Elmah.Error(Model.Exception, HttpContext.Current))
    End Code

<h2>
    Sorry, an error occurred while processing your request.<br />

    @item.ActionName<br />
    @item.ControllerName<br />
    @item.Exception.Message
</h2> 

यह बस है!


यह अब तक का सबसे सरल उपाय है। कस्टम हैंडलर और सामान लिखने या रजिस्टर करने की आवश्यकता नहीं है। मेरे लिए ठीक काम करता है
थियागोवल्स

3
किसी भी JSON / गैर-HTML प्रतिक्रियाओं के लिए अनदेखा किया जाएगा।
क्रेग स्टंटज

6
यह भी एक दृश्य में सेवा स्तर की कार्यक्षमता कर रहा है। यहाँ नहीं है
ट्रेवर डे कोएकोक

6

एक पूरी तरह से वैकल्पिक समाधान एमवीसी का उपयोग नहीं करना है HandleErrorAttribute, और इसके बजाय ASP.Net त्रुटि हैंडलिंग पर भरोसा करते हैं, जिसे एल्माह के साथ काम करने के लिए डिज़ाइन किया गया है।

आपको HandleErrorAttributeApp_Start \ FilterConfig (या Global.asax) से डिफ़ॉल्ट वैश्विक को निकालने की आवश्यकता है , और फिर अपने Web.config में एक त्रुटि पृष्ठ सेट करें:

<customErrors mode="RemoteOnly" defaultRedirect="~/error/" />

ध्यान दें, यह एक एमवीसी रूट किया गया URL हो सकता है, इसलिए उपरोक्त ErrorController.Indexत्रुटि होने पर कार्रवाई को पुनर्निर्देशित करेगा ।


यह अब तक का सबसे सरल उपाय है, और डिफ़ॉल्ट पुनर्निर्देशन एमवीसी कार्रवाई हो सकती है :)
जेरेमी कुक

3
यह JSON आदि जैसे अन्य प्रकार के अनुरोधों के लिए पुनर्निर्देशित करेगा - अच्छा नहीं।
zvolkov

5

मेरे लिए ईमेल लॉगिंग काम करना बहुत महत्वपूर्ण था। कुछ समय बाद मुझे पता चला कि आतिफ उदाहरण में कोड की केवल 2 लाइनों की आवश्यकता है।

public class HandleErrorWithElmahAttribute : HandleErrorAttribute
{
    static ElmahMVCMailModule error_mail_log = new ElmahMVCMailModule();

    public override void OnException(ExceptionContext context)
    {
        error_mail_log.Init(HttpContext.Current.ApplicationInstance);
        [...]
    }
    [...]
}

मुझे आशा है कि यह किसी की मदद करेगा :)


2

यह वही है जो मुझे अपने MVC साइट कॉन्फ़िगरेशन के लिए आवश्यक था!

मैंने OnExceptionकई HandleErrorAttributeउदाहरणों को संभालने के लिए विधि में थोड़ा संशोधन किया , जैसा कि आतिफ अजीज ने सुझाया था:

इस बात को ध्यान में रखें कि आपको इस बात का ध्यान रखना पड़ सकता है कि यदि कई HandleErrorAttributeउदाहरण प्रभावी हैं तो डुप्लिकेट लॉगिंग नहीं होती है।

मैं बस context.ExceptionHandledआधार वर्ग को लागू करने से पहले जांचता हूं , यह जानने के लिए कि क्या किसी और ने वर्तमान हैंडलर से पहले अपवाद को संभाला है।
यह मेरे लिए काम करता है और मैं किसी और की आवश्यकता होने पर कोड पोस्ट करता हूं और यह पूछने के लिए कि क्या किसी को पता है कि मैंने कुछ भी अनदेखा किया है।

आशा है कि यह उपयोगी है:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}

आपको लगता है कि आधार को लागू करने के आसपास "अगर" कथन नहीं है। एक अपवाद। क्या मैं कुछ भूल रहा हूँ?
योएलवह

पहले मैं जांच करता हूं कि क्या कोई अन्य हैंडलर, वर्तमान से पहले आह्वान किया गया है, अपवाद को प्रबंधित करता है और मैं परिणाम को चर में संग्रहीत करता हूं: अपवादHandlerdByPrepretHandler। तब मैं वर्तमान हैंडलर को स्वयं अपवाद का प्रबंधन करने का मौका देता हूं: base.OnException (संदर्भ)।
इल्मते

पहले मैं जांच करता हूं कि क्या कोई अन्य हैंडलर, वर्तमान से पहले आह्वान किया गया है, अपवाद को प्रबंधित करता है और मैं परिणाम को चर में संग्रहीत करता हूं: अपवादHandlerdByPrepretHandler। तब मैं वर्तमान हैंडलर को स्वयं अपवाद का प्रबंधन करने का मौका देता हूं: base.OnException (संदर्भ)। यदि अपवाद पहले से प्रबंधित नहीं किया गया था तो यह हो सकता है: 1 - यह वर्तमान हैंडलर द्वारा प्रबंधित किया जाता है, फिर: अपवादHandledByPrepretHandler = false और। अपवाद सच्चा। केवल केस 1 लॉग होगा।
इल्मते
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.