ASP.net MVC[हैंडलेयर] अपवादों को नहीं पकड़ रहा है




asp.net-mvc exception-handling (5)

दो अलग-अलग एप्लिकेशन में, एक कस्टम एक और नमूना एमवीसी एप्लिकेशन जो आपको एक नए वीएस 2008 एमवीसी प्रोजेक्ट के साथ मिलता है, [हैंडलेयर] अपवादों को नहीं पकड़ रहा है।

नमूना आवेदन में मेरे पास है:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

जो कि परीक्षण के लिए फेंके जाने वाले अपवाद के साथ सिर्फ डिफ़ॉल्ट नियंत्रक है।

लेकिन यह काम नहीं करता है। डिफ़ॉल्ट error.aspx पृष्ठ पर जाने के बजाय यह ब्राउज़र में डीबग जानकारी दिखाता है।

समस्या पहली बार एक कस्टम एप्लिकेशन में क्रॉप की गई थी, जिस पर मैं काम कर रहा था, जिससे मुझे नमूना एप्लिकेशन के साथ इसका परीक्षण करना पड़ा। यह सोचकर कि मुझे कस्टम एप्लिकेशन में किए गए परिवर्तनों के साथ कुछ करना है, मैंने इंडेक्स पद्धति में फेंक के अपवाद (yuck) के साथ नमूना एप्लिकेशन को पूरी तरह से अपरिवर्तित छोड़ दिया।

मैं उलझन में हूं। मैं क्या खो रहा हूँ?


बाहर देखो: मेरे मामले में मैं Controller निर्माणकर्ता के अंदर फेंके गए exception को पकड़ने के लिए HandleError विशेषता पाने की कोशिश कर रहा था! बेशक यह इसे पकड़ नहीं होगा। HandleError विशेषता केवल Controller क्रियाओं के अंदर फेंके गए अपवादों को पकड़ती है। यह MSDN पृष्ठ में वहीं है (उस पर अधिक ध्यान देना चाहिए):

एक विशेषता का प्रतिनिधित्व करता है जो एक अपवाद को संभालने के लिए उपयोग किया जाता है जिसे एक क्रिया विधि द्वारा फेंक दिया जाता है।

एक और बात जो हो रही थी वह यह थी कि कंट्रोलर का OnException(ExceptionContext exceptionContext) ओवरराइड विधि कभी नहीं कहा जा रहा था। फिर से: निश्चित रूप से इसे नहीं बुलाया जाएगा क्योंकि मैं Controller के निर्माणकर्ता के अंदर एक अपवाद फेंक रहा था।

मैंने यह पता लगाने की कोशिश में 1 घंटा बिताया। : ओ) आशा है कि यह अगली आत्मा में मदद करता है ...

संकेत के रूप में: याद रखें कि HandleError विशेषता केवल 500 त्रुटियों को पकड़ती है। अन्य लोगों के लिए आपको Web.config में <customErrors> अनुभाग घोषित करना चाहिए:

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>

Web.config में, कस्टमरियर्स बदलें:

<system.web>
  <customErrors mode="On">
  </customErrors>

यदि मोड या तो ऑफ या रिमोटऑनली है, तो आपको कस्टम त्रुटि पेज के बजाय मौत की पीली स्क्रीन दिखाई देगी। तर्क यह है कि डेवलपर्स आमतौर पर पीले रंग की स्क्रीन पर अधिक विस्तृत जानकारी चाहते हैं।


कुछ मूर्खतापूर्ण स्थिति है जो एक बार मेरे साथ हुई थी, इसलिए किसी के लिए सहायक हो सकती है।

सुनिश्चित करें कि आपने सही web.config फ़ाइल में <customErrors mode="On" /> जोड़ दिया है।

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


मैंने इसके साथ ही संघर्ष किया है और मुझे विश्वास है कि मैं अब समस्या को समझता हूं।

उम्मीद के मुताबिक काम करने के लिए कम से कम [HandleError] काम कर रहे हैं:

आपको web.config में कस्टम त्रुटियों को सक्षम करना होगा और आपको यह भी <customErrors> होगा कि आपकी त्रुटि दृश्य <customErrors> टैग में <customErrors>

उदाहरण:

<customErrors mode="On" defaultRedirect="Error" />

defaultRedirect="Error" भाग को छोड़ने से ब्राउज़र में 500 त्रुटि उत्पन्न होगी - ASP.NET त्रुटि पृष्ठ (YSOD) नहीं।

साथ ही आपको रिलीज़ मोड में होना आवश्यक नहीं है। मैंने डिबग बिल्ड के साथ इसका परीक्षण किया और यह ठीक काम किया।

मेरा वातावरण .NET 4 और मानक, "ASP.NET MVC 2 वेब एप्लिकेशन" प्रोजेक्ट टेम्पलेट का उपयोग करके विज़ुअल स्टूडियो 2010 था।

मुझे उलझन में था कि हैंडलेयररूट एट्रिब्यूट क्लास के लिए MSDN प्रलेखन क्या था। यह स्पष्ट रूप से नहीं कहता है कि आपको web.config में कस्टम त्रुटियों को चालू करना होगा। और मुझे लगता है कि मुझे इसकी आवश्यकता थी [Handle Error] विशेषता।


इस समस्या का एक और कारण हो सकता है,

टेम्पलेट MVC एप्लीकेशन (VS2008 / VS2008 एक्सप्रेस द्वारा उत्पन्न) में, Error.aspx (वीएस द्वारा उत्पन्न) मास्टर पेज का उपयोग करता है।

यदि मास्टर पृष्ठ किसी भी ViewData तक पहुँच प्राप्त करता है, तो यह अशक्त संदर्भ अपवाद को फेंक देगा, तो error.aspx नहीं दिखाया जाएगा।

इस सरल कोड को अपने Error.aspx के रूप में उपयोग करें, यह समस्या को हल करेगा, (साथ में CustomErrors = On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>




handleerror