2009-08-31 14 views
7
त्रुटि

मान लीजिए मैं अपने ASP.NET MVC साइट में एक मास्टर पेज में कहीं निम्नलिखित कोड डालें मेरे नियंत्रक पर रखा गया, यह अपवाद अभी भी बुलबुला हुआ है। मैं इस तरह की त्रुटियों से कैसे निपट सकता हूं? मैं एक त्रुटि पृष्ठ पर रूट करने में सक्षम होना चाहता हूं और अभी भी अपवाद विवरण लॉग इन करने में सक्षम होना चाहता हूं।वैश्विक ASP.NET में (नियंत्रक के बाहर) से निपटने MVC

इस तरह से निपटने का सबसे अच्छा तरीका क्या है?

संपादित करें: एक समाधान जो मैं विचार कर रहा था वह एक नया नियंत्रक जोड़ना होगा: UnhandledErrorController। क्या मैं Global.asax में Application_Error विधि डाल सकता हूं और फिर इस नियंत्रक पर रीडायरेक्ट कर सकता हूं (जहां यह अपवाद के साथ क्या करना है)?

नोट: customErrors में defaultRedirect web.config तत्व अपवाद जानकारी के साथ पास नहीं होता है।

+1

ApplicationException वास्तव में एक विरोधी अभ्यास आजकल, है कृपया देखें: http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx केवल नए Excep फेंकने पर विचार करें tion (...); – Stephanvs

उत्तर

5

चूंकि एमवीसी एएसपीनेट के शीर्ष पर बनाया गया है, तो आप web.config में वैश्विक त्रुटि पृष्ठ को परिभाषित करने में सक्षम होना चाहिए, जैसा कि आप वेब रूपों में कर सकते हैं।

<customErrors mode="On" defaultRedirect="~/ErrorHandler" /> 
+7

फिर मैं अपवाद विवरण कैसे प्राप्त करूं? – user10789

1

जहां तक ​​क्या पृष्ठ प्रदर्शित करने के लिए, आप अपने web.config में एक customErrors section बना सकते हैं और इसे सेट अप जो कुछ भी स्थिति कोड आप को संभालने के लिए चाहते हैं के लिए की आवश्यकता होगी।

उदाहरण:

<customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly"> 
    <error statusCode="500" redirect="InternalError.htm"/> 
</customErrors> 

जहाँ तक प्रवेश अपवाद के रूप में, मैं ELMAH का उपयोग कर की सिफारिश करेंगे। यह एएसपी.नेट एमवीसी साइटों के साथ अच्छी तरह से एकीकृत करता है।

+0

हां, हैंडलरर वास्तव में कुछ भी नहीं करेगा जब तक आपके पास कॉन्फ़िगरेशन में कस्टमर नहीं है। – swilliams

+0

मुझे अभी भी अपवाद विवरण पुनर्प्राप्त करने और लॉग इन करने में सक्षम होना चाहिए। पसंदीदा रूप में, मैं इसे नियंत्रक कार्रवाई में करने में सक्षम हूं जो डिफ़ॉल्ट रेडियोधर्मी बिंदुओं को इंगित करता है। – user10789

+0

@iguananet यही ईएलएमएएच करता है। यदि आप इसे अलग से करना चाहते हैं तो यह एक अलग मामला है, लेकिन यह बहुत अच्छी तरह से काम करता है। मैं अत्यधिक कोशिश करने की सिफारिश करता हूं। – Joseph

5

आप एक ऐसा फ़िल्टर OnActionExecuted विधि में एक अपवाद के लिए लग रहा है बना सकते हैं:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class WatchExceptionAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
    if (filterContext.Exception != null) { 
     // do your thing here. 
    } 
    } 
} 

तो फिर तुम एक नियंत्रक या कार्रवाई विधि पर [WatchException] रख सकते हैं, और यह दूँगी लोग इन अपवाद नहीं। यदि आपके पास बहुत सारे नियंत्रक हैं, तो यह कठिन हो सकता है, इसलिए यदि आपके पास एक सामान्य बेस कंट्रोलर है तो आप वहां OnActionExecuted ओवरराइड कर सकते हैं और वही काम कर सकते हैं। मैं फिल्टर विधि पसंद करते हैं।

10

सक्षम customErrors:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="401" redirect="~/Error/Unauthorized" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

और एक कस्टम त्रुटि नियंत्रक को अनुप्रेषित:

[HandleError] 
public class ErrorController : BaseController 
{ 
    public ErrorController() 
    { 
    } 

    public ActionResult Index() 
    { 
     Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     return View ("Error"); 
    } 

    public ActionResult Unauthorized() 
    { 
     Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
     return View ("Error401"); 
    } 

    public ActionResult NotFound() 
    { 
     string url = GetStaticRoute (Request.QueryString["aspxerrorpath"] ?? Request.Path); 
     if (!string.IsNullOrEmpty (url)) 
     { 
      Notify ("Due to a new web site design the page you were looking for no longer exists.", false); 
      return new MovedPermanentlyResult (url); 
     } 

     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View ("Error404"); 
    } 
} 
+0

वेब कॉन्फ़िगर के किस हिस्से में मुझे कस्टम त्रुटियां डालने की आवश्यकता है? – Zapnologica

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