2009-03-06 8 views
39

दो अलग-अलग अनुप्रयोगों में, एक नया वीएस -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(); 
    } 
} 

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

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

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

मैं स्टंप हो गया हूं। मैं क्या खो रहा हूँ?

उत्तर

65

web.config में, परिवर्तन customErrors:

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

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

+4

यही किया था। धन्यवाद। –

+3

मैंने यह किया और यह काम नहीं किया। मैंने जो पाया है वह है कि एक एमवीसी 2 प्रशंसा में एक से अधिक Web.config फ़ाइलों को डिफ़ॉल्ट टेम्पलेट में हैं। आपको अपने समाधान में रूट-अधिकांश Web.config में customErrors टैग को लागू करने की आवश्यकता है। – Mike

+0

@ माइक, यह सभी एमवीसी संस्करणों के लिए सच है। –

15

महत्वपूर्ण: सावधान रहें कि आपके त्रुटि पृष्ठ में कोई त्रुटि नहीं है!

यदि यह करता है कि आप उस एएसपी.NET कस्टम त्रुटि पृष्ठ के साथ समाप्त हो जाएंगे और सर्किलों में घूमते हैं और अपने बालों को फाड़ते हैं। बस उस पृष्ठ से सब कुछ पट्टी करें जो संभवतः एक त्रुटि का कारण बन सकता है और इसका परीक्षण कर सकता है।

'कस्टमरर्स' के संबंध में या बंद होने के संबंध में दोस्ताना त्रुटि पृष्ठ (आपका एरर्स.एएसपीएक्स) पृष्ठ दिखाया जाएगा या नहीं, इसके लिए कई योगदान कारक हैं।

this blog देखें (नीचे छोड़कर)

HttpContext.IsCustomErrorEnabled - तीन अलग-अलग स्रोतों

  1. web.config के < तैनाती > अनुभाग के खुदरा संपत्ति पर लग रहा है। सर्वर पर आपके अनुप्रयोग को सर्वर पर तैनात करते समय सेट करने के लिए यह उपयोगी प्रॉपर्टी है। यह कस्टम त्रुटियों के लिए किसी अन्य सेटिंग्स को ओवरराइड करता है।
  2. web.config's <customErrors> अनुभाग की मोड संपत्ति। यह सेटिंग इंगित करती है कि कस्टम त्रुटियां सक्षम हैं या नहीं, और यदि ऐसा है तो वे केवल दूरस्थ अनुरोधों के लिए सक्षम हैं या नहीं।
  3. HttpRequest ऑब्जेक्ट की IsLocal संपत्ति। यदि कस्टम त्रुटियां केवल दूरस्थ अनुरोधों के लिए सक्षम हैं, तो आपको पता होना चाहिए कि अनुरोध दूरस्थ कंप्यूटर से है या नहीं।जब आप त्रुटियों को देखने करना चाहते हैं, और उसके बाद ही उत्पादन के लिए इसे सक्षम -

विचार यहाँ आप 'customErrors' विकास के दौरान बंद कर दिया है सकते हैं।

यह MSDN article विशेषता को आगे चर्चा करता है।

13

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

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

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

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

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

"यदि मास्टर पेज किसी भी व्यूडेटा को एक्सेस करता है शून्य संदर्भ अपवाद फेंक देगा "उस लाइन ने मुझे वापस लाया। धन्यवाद! –

8

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

संक्षेप में अपेक्षा के अनुरूप [HandleError] काम होने के लिए आवश्यकताएँ हैं:

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

उदाहरण:

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

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

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

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

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

+0

वास्तव में वही समस्या है और अभी भी एक ही समस्या है। यहां अधिक जानकारी: http://stackoverflow.com/questions/11231165/asp-net-mvc-errorhandler-not-showing-custom-error-page – user20358

+0

मुझे अभी भी ब्राउज़र में 500 त्रुटि मिल रही है !! – user20358

4

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

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


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

+0

मुझे कभी पता नहीं चलेगा कि उन्होंने फैसला क्यों किया कि उन्हें दो वेब कॉन्फ़िगरेशन की आवश्यकता है :( – martijn

+0

"दूसरा" एक रेजर इंजन के लिए ही है। संभावित रूप से आप कहीं भी अपने विचार रख सकते हैं, इसलिए प्रोजेक्ट में web.config नहीं हो सकता है (जैसा कि वेब प्रोजेक्ट) या आप अपनी अलग सेटिंग्स चाहते हैं। मैं मानता हूं, यह कोडिंग में ऐसी गलतियों को रोकने के लिए किसी अन्य तरीके से किया जा सकता है, लेकिन आम तौर पर इसका अर्थ होता है। – Agat

1

ध्यान दें: मेरे मामले में मैं एक exceptionController रों निर्माता अंदर फेंका पकड़ने के लिए 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> 
संबंधित मुद्दे