2009-09-23 14 views
14

मैं अपने एमवीसी प्रोजेक्ट के साथ Application_Error का उपयोग करना चाहता हूं, लेकिन मैं इसे काम नहीं कर सकता। मैं अपने Global.asax फ़ाइल में निम्न जोड़ें: (। सत्र परीक्षण के लिए ही है इम वाला त्रुटि लॉग इन करने के लिए एक डेटाबेस का उपयोग करें, अगर मैं यह काम करने के लिए मिलता है।)मैं एएसपी.नेट एमवीसी में Application_Error का उपयोग कैसे करूं?

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception objErr = Server.GetLastError().GetBaseException(); 
     Session["Test"] = "Message:" + objErr.Message.ToString(); 
    } 

तो मैं एक फेंक करने की कोशिश मेरे होम कंट्रोलर और मेरे होम/इंडेक्स व्यू से अपवाद, लेकिन यह केवल डीबग ट्रिगर करता है।

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

मेरी Webconfig फ़ाइल में मैं एक defaulterror पेज सेट, लेकिन यह दृश्य पर रीडायरेक्ट नहीं करता:

<customErrors defaultRedirect="Home/Error"> 
     <error statusCode="403" redirect="NoAccess.htm" /> 
     <error statusCode="404" redirect="FileNotFound.htm" /> 
    </customErrors> 

उत्तर

14

तो सबसे पहले याद रखें कि वैश्विक त्रुटि प्रबंधन अंतिम उपाय होना चाहिए, और नियंत्रक वर्गों में त्रुटियों के लिए एक विशिष्ट त्रुटि विधि है;

protected virtual bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception) 
यह आप मानक साझा त्रुटि दृश्य रीडायरेक्ट कर सकते हैं के भीतर

;

protected override bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception) 
{ 
    RenderView("Error", exception); 
    return false; 
} 
समस्या आप वैश्विक अनुप्रयोग त्रुटि में है

यह विचार या नियंत्रकों की कोई अवधारणा नहीं है कि है, इसलिए यदि आप वहाँ में रीडायरेक्ट करना चाहते हैं तो आप एक ज्ञात यूआरएल का उपयोग करना चाहिए

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    System.Diagnostics.Debug.WriteLine(exception); 
    Response.Redirect("/Home/Error"); 
} 

लेकिन आपको ऐसा करने की आवश्यकता नहीं है। यदि आप वेब में डिफ़ॉल्ट त्रुटि पृष्ठ सेट करते हैं।config तो आप उस

<customErrors defaultRedirect="Home/Error" /> 

अनुप्रेषित हालांकि, जब तक आप अपने घर नियंत्रक को एक त्रुटि का मानना ​​है कि अस्तित्व में नहीं है जोड़ दिया है की जरूरत नहीं है, इसलिए जोड़ने घर नियंत्रक

public ActionResult Error() 
{ 
    return View(); 
} 
के लिए निम्न

फिर (यदि आप समझदार हैं) तो आप त्रुटि() विधि में त्रुटि हैंडलिंग कोड डाल देंगे, क्योंकि वह सभी अनचाहे त्रुटियां समाप्त हो जाएंगी।

public ActionResult Error() 
{ 
    Exception exception = Server.GetLastError(); 
    System.Diagnostics.Debug.WriteLine(exception); 
    return View(); 
} 

और अंत में याद रखें कि डिफ़ॉल्ट रूप से आप कस्टम त्रुटियों को नहीं देख पा यदि आप स्थानीय होस्ट से कनेक्ट कर रहे हैं! तो आपको उस व्यवहार को बदलने की जरूरत है

<customErrors mode="On" defaultRedirect="/Home/Error" /> 
+1

मुझे आपके समाधान में कोई समस्या है। CustomErrors नियंत्रक को ट्रिगर किए बिना सीधे होम/त्रुटियों के दृश्य पर रीडायरेक्ट करता है। मुझे नहीं पता था कि यह क्या संभव था, लेकिन जब मैं त्रुटि क्रिया विधि पर डीबग पॉइंट डालता हूं तो डीबग कभी कॉल नहीं होता है। त्रुटि दृश्य केवल स्क्रीन पर प्रदर्शित होता है, लेकिन यूआरएल अभी भी यूआरएल जैसा ही है जो त्रुटि को ट्रिगर करता है। उदाहरण के लिए यदि मैं/होम/जॉब पर एक त्रुटि ट्रिगर करता हूं तो मुझे त्रुटि दृश्य मिलेगा लेकिन यूआरएल अभी भी/होम/जॉब – Poku

+18

हे @ ब्लौडार्ट: एक नए उपयोगकर्ता का संदेश सौजन्य जो टिप्पणी नहीं कर सकता: यह जवाब फ्लैट-आउट है गलत। समस्या यह है कि नियंत्रक वर्ग से Server.GetLastError() को कॉल करना काम नहीं करता है यदि आप web.config का उपयोग डिफ़ॉल्ट नियंत्रक कार्रवाई पर रीडायरेक्ट करने के लिए करते हैं। एएसपी त्रुटि नियंत्रक को एक नया HTTP अनुरोध शुरू करता है, जो अपवाद जानकारी खोने, सर्वर चर को साफ़ करता है। –

+3

खराब उत्तर ..... यहां एक अच्छा लेख है कि आपको http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

1
  • आप एक सत्र पहली जगह में स्थापित है? अगर IHttpHandler से त्रुटि IRequiresSessionState के साथ चिह्नित नहीं है, तो Session तक पहुंच विफल हो जाएगी।
  • Session["Test"] के साथ आप क्या कर रहे हैं? क्या आप वाकई अपना कोड काम नहीं कर रहे हैं? आप एक फ़ाइल आज़मा सकते हैं। C:\my-log.txt पर कुछ टेक्स्ट (कहें, वर्तमान समय) को आउटपुट करें और बस आउटपुट करें, जो Session का उपयोग करने में सफल होने की संभावना अधिक है।
  • GetBaseException इस मामले में उपयोगी नहीं है (न ही आम तौर पर लॉगिंग के लिए) जहां तक ​​मैं कह सकता हूं।
  • Message प्रकार string है - .ToString() पर कॉल करना आवश्यक नहीं है। आम तौर पर, मैं दृढ़ता से ToString() से बचने की दृढ़ता से अनुशंसा करता हूं - यदि आप इसका उपयोग कर रहे हैं क्योंकि आप ऑब्जेक्ट के प्रकार से अनिश्चित हैं, तो यह एक लाल झंडा होना चाहिए; टाइप सिस्टम के चारों ओर एक अंत-रन करने से सूक्ष्म बग छिपा सकते हैं (उदाहरण के लिए, DBNull.Value.ToString() == "")। जीयूआई के लिए बिल्टिन प्रकार .ToString(IFormatProvider) ओवरलोड प्रदान करते हैं जो संस्कृति-संवेदनशील है और पोर्टेबिलिटी मुद्दों से बचता है। चूंकि उस अधिभार object पर मौजूद नहीं है क्योंकि यह बहुत ही कमजोर टाइप .ToString कॉल से बचने के लिए एक सुरक्षा भी है।
संबंधित मुद्दे

 संबंधित मुद्दे