2010-01-14 32 views
8

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

यहां मेरे वैश्विक में क्या है।

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current != null) 
    { 
     Exception ex = HttpContext.Current.Server.GetLastError(); 
     if (ex is MyCustomException) 
     { 
      // do stuff 
     } 
    } 
} 

और इस प्रकार मेरी अपवाद फेंक दिया जाता है:

if(false) 
    throw new MyCustomException("Test from here"); 

जब मैं डाल दिया है कि फाइल अपवाद फेंकने के भीतर से एक कोशिश पकड़ में, मेरे Application_Error विधि में पहुँच हो जाता है कभी नहीं। किसी के पास कुछ सुझाव हैं कि मैं इसे वैश्विक रूप से कैसे संभाला जा सकता हूं (मेरे कस्टम अपवाद से निपटें)?

धन्यवाद।

1/15/2010 संपादित करें: // डू सामान में क्या है।

RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "Home", action = "Index" })).VirtualPath; 
filterContext.HttpContext.Response.Redirect(url, true); 
+0

+1 डफ स्टफ बिट – stuartdotnet

उत्तर

10

आप अपने नियंत्रकों/कार्यों के लिए एक ग्राहक फ़िल्टर बनाना चाहते हैं। आपको FilterAttribute और IExceptionFilter से उत्तराधिकारी होना होगा।

कुछ इस तरह:

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(MyCustomException)) 
     { 
      //Do stuff 
      //You'll probably want to change the 
      //value of 'filterContext.Result' 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 

एक बार आप इसे बनाने के बाद, फिर वह विशेषता एक BaseController कि आपके सभी अन्य नियंत्रकों से विरासत के लिए आवेदन कर सकते हैं यह साइट विस्तृत कार्यक्षमता बनाने के लिए।

इन दो लेख मदद कर सकता है:

+0

ठीक है, तो मैं इसे एक दूंगा। परीक्षण उद्देश्यों के लिए, अगर मैं इसे सीधे अपने नियंत्रकों में से एक में जोड़ना चाहता हूं, तो मैं ऐसा करने के लिए कैसे जाऊं? नौसिखिया के लिए खेद है:/ – Kyle

+0

मैंने अपनी कंट्रोलर क्लास के शीर्ष पर "[CustomExceptionFilter]" विशेषता जोड़ने और फिर अपवाद फेंकने की कोशिश की और यह इस फ़िल्टर द्वारा पकड़ा नहीं जा रहा प्रतीत होता है। यह पहले की तरह एक ही त्रुटि फेंक नहीं रहा है, लेकिन यह मेरा कस्टम अपवाद फ़िल्टर मार नहीं रहा है। मैंने इसे एक्शनमेड पर डालने का भी प्रयास किया जिसे मैं मार रहा हूं कि अपवाद फेंकना चाहिए, और यह वहां काम नहीं कर रहा है ... कोई विचार? – Kyle

+0

मेरी आखिरी टिप्पणी खरोंच, मैं अपने फेंक को वापस अंदर रखना भूल गया था। जब मैंने किया, तो मुझे वही त्रुटि मिल रही है क्योंकि "मेरा अपवाद उपयोगकर्ता कोड द्वारा अनचाहे था"। क्या मुझे इसे पकड़ने की कोशिश में चाहिए? – Kyle

0

मैं इस सवाल का जवाब मिल गया है (और प्रश्न) Asp.net mvc override OnException in base controller keeps propogating to Application_Error

इम अपने मामले बात मददगार है कि आप याद आ रही है कि आपको अपनेमें FilterConfig.cs पर अपना कस्टम फ़िल्टर जोड़ने की आवश्यकता हैफ़ोल्डर:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new CustomExceptionFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
संबंधित मुद्दे