2011-05-13 22 views
33

में त्रुटि हैंडलिंग क्या एएसपीएनटी एमवीसी 3 में त्रुटियों को संभालने के लिए कोई अंतर्निहित या उचित तरीका है? यह एक विशिष्ट त्रुटि पृष्ठ पर जाता हैएएसपीनेट एमवीसी 3

  1. अनुप्रयोग क्रैश हो जाता है, तो या कोई त्रुटि फेंकता है,:

    यह मुझे क्या करना चाहते हैं।

  2. मैं नियंत्रक कार्रवाई से अपनी खुद की त्रुटि फेंक सकता हूं। (और यह एक त्रुटि पृष्ठ पर जाता है)।

    1. मैं देख रहा हूँ वहाँ यह here करने के लिए एक लंबा रास्ता तय करना है:

    मैं निम्नलिखित तरीके पाया। (v1 और v2 के लिए लेकिन v3 पर लागू होता है)।

  3. त्रुटिरोधी विशेषता here का उपयोग करना।

मैं इसे उचित तरीके से कैसे संभाल सकता हूं?

यदि समाधान समान है या उपरोक्त सूची में # 1 जैसा है, तो मैं निंजा का उपयोग कर रहा हूं और मैंने बेस क्लास नहीं बनाया है। मैं अभी भी यह कैसे करूं?

उत्तर

13


हैंडलिंग वैश्विक त्रुटि के लिए आपको बस इतना करना है customErrors मोड बदलने = "पर" के माध्यम से Error.cshtml साझा फ़ोल्डर में रहता है web.config पेज में
त्रुटि प्रदर्शित किया जाएगा है।

सुनिश्चित करें कि Error.cshtml लेआउट शून्य नहीं है।
[यह कुछ ऐसा होना चाहिए: @ {लेआउट = "~/दृश्य/साझा/_Layout.cshtml"; }
या Error.cshtml के लिए लेआउट = अशक्त कोड ब्लॉक]
एक नमूना मार्कअप को दूर: -

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo 

<!DOCTYPE html> 
<html> 
<head> 
    <title>Error</title> 
</head> 
<body> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
    <p>Controller Name: @Model.ControllerName</p> 
    <p>Action Name : @Model.ActionName</p> 
    <p>Message: @Model.Exception.Message</p> 
</body> 
</html> 

हैंडलिंग
नियंत्रक कक्षा में विशिष्ट कार्रवाई करने के लिए HandleError विशेषता जोड़ें विशिष्ट त्रुटि के लिए। उस विशिष्ट त्रुटि के लिए 'व्यू' और 'अपवाद टाइप' प्रदान करें।
एक नमूना NotImplemented अपवाद संचालक:

public class MyController: Controller 
    { 
     [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))] 
     public ActionResult Index() 
     { 
      throw new NotImplementedException("This method is not implemented."); 
      return View(); 
     } 
} 
15

मैं कस्टम हैंडलरर एट्रिब्यूट एक्शन फ़िल्टर को लागू करने का सुझाव दूंगा।

अधिक जानकारी के लिए इस लिंक देखें:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

एक HandleErrorAttribute कार्रवाई फिल्टर सेट करने से आपको पूरा नियंत्रण है जिस पर कार्रवाई फिल्टर द्वारा नियंत्रित किया जाता है देता है, और यह नियंत्रक स्तर पर स्थापित करने के लिए आसान है, या यहाँ तक पर इसे कस्टम बेस कंट्रोलर पर सेट करके साइट स्तर, और आपके सभी नियंत्रकों को मूल नियंत्रक से प्राप्त होता है।

मैं इसके साथ कुछ और करता हूं, क्या मेरे पास एक अलग हैंडलजेसन एरर एट्रिब्यूट है जो कस्टम पेज की बजाय जेसन प्रतिक्रिया लौटकर अजाक्स कॉल का जवाब देता है।

अद्यतन:

public class HandleJsonErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     var serviceException = filterContext.Exception as ServiceException; 

     filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

     filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } }; 

     filterContext.ExceptionHandled = true; 
    } 
} 

यहाँ और jQuery है कि मैं इन unhanded अपवाद को संभालने के लिए उपयोग करते हैं::

नीचे कुछ सवाल के अनुसार, यहां एक HandleJsonErrorAttribute है कि मैं का उपयोग का एक उदाहरण है

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    showPopdown($.parseJSON(jqXHR.responseText).message); 
}); 

यह मेरी अजाक्स विधियों को बहुत हल्का होने की अनुमति देता है - वे केवल सामान्य जेसन को वापस संभालते हैं, और एक अनचाहे अपवाद की स्थिति में, एक संदेश w/त्रुटि स्थिति कोड जेसन में लपेटा जाता है और लौटाया जाता है।

इसके अलावा, मेरे कार्यान्वयन में, मेरे पास कस्टम ServiceException है जो मैं सेवाओं से फेंकता हूं, और यह एक सामान्य संदेश की बजाय सेवा परत से संदेश भेजता है।

+0

क्या आप उदाहरण दे सकते हैं कि मैं इन हैंडैक्स त्रुटि कॉल को 'हैंडलजेसन एरर एट्रिब्यूट' का उपयोग करके कैसे संभालेगा? – AdrianoRR

+0

हाँ मुझे HandleJsonErrorAttribute में दिलचस्पी है। क्या आप मुझे और जानकारी और/या उदाहरण दे सकते हैं? –

+0

अच्छा कोड! इससे मेरा काम बनता है। धन्यवाद! मैंने केवल स्टेटस कोड को "ठीक" में बदल दिया है और अपवाद को अपने कोड में संभाल लिया है। हर किसी के लिए जो उपयोग करना है, उसे खोजने के लिए: केवल एक्शन में विशेषता डालें (जैसे: [हैंडलजेसन एररएट्रिब्यूट] सार्वजनिक जेसन रीसेट एक्शननामैम (ऑब्जेक्ट कुछ आर्ट्स) {...} –

2

मैं सबसे आसान तरीका है ExceptionHandler विशेषता का उपयोग किया जाता है, क्योंकि यह किसी भी समय उपयोग करने के लिए आप एक नया ASP.NET MVC 3 परियोजना बनाने के लिए तैयार है लगता है। आप अभी भी कस्टम त्रुटि पृष्ठ का उपयोग करने के लिए Web.config को कॉन्फ़िगर कर सकते हैं और वैश्विक अनुप्रयोग_इरर विधि में अपवादों को सामान्य रूप से प्रबंधित कर सकते हैं, लेकिन जब कोई अपवाद होता है तो URL को नए एमवीसी 3 के तरीके के रूप में अच्छा नहीं दिखाया जाता है।

+1

बिल्कुल विशेषता विशेषता हैंडलरर है। –

1

अगर आप अपवाद संचालन के लिए एक तरह से अनुकूलित करने के लिए चाहते हैं MVC में कस्टम अपवाद बना सकते हैं। आप यहां उपयोगी पोस्ट पा सकते हैं। http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

+0

कृपया विषय सामग्री पोस्ट करें, न कि एक लिंक। –

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