2015-03-03 4 views
6

के माध्यम से अपवाद उठाए जाने पर एएसपीनेट वेब एपीआई में अपवादों को वैश्विक रूप से कैसे संभाला जाए, मेरे पास मेरे वेब एपीआई प्रोजेक्ट में वैश्विक अपवाद हैंडलर है। जब यह लैम्ब्डा अभिव्यक्ति के माध्यम से अपवाद उठाया जाता है तो यह ठीक काम करता है। मैं नीचे एक नमूना कोड प्रदान की है: मेरे WebApiConfig कक्षा मेंलैंपडा अभिव्यक्ति

[HttpGet] 
public IHttpActionResult Test() 
{ 
    //Throw new Exception();// this exception is handled by my ExceptionHandler 
    var list = new List<int>(); 
    list.Add(1); 
    IEnumerable<int> result = list.Select(a => GetData(a)); 
    return Ok(result); 
} 

private static int GetData(int a) 
{ 
    throw new Exception();//This is not handled by my global exception handler 
} 

यह मेरा वैश्विक अपवाद संचालक

public class ExceptionHandlerAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     //Do something 
    } 
} 

मैं इसे रजिस्टर

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { action = "Get", id = RouteParameter.Optional } 
     ); 
     config.Filters.Add(new ExceptionHandlerAttribute()); 
    } 
} 

उत्तर

1

ExceptionFilterAttribute केवल फेंका अपवाद के लिए काम करता है में अपनी क्रिया विधि, Exception Handling in ASP.NET Web API - Exception Filters देखें। आपका कोड परिणाम के भौतिकरण के दौरान अपवाद फेंक देगा, जिससे SerializationException हो सकता है।

रूप Global Error Handling in ASP.NET Web API 2 में विस्तार से बताया:

कुछ बिना क्रिया अपवाद अपवाद फिल्टर के माध्यम से संसाधित किया जा सकता है, लेकिन उन मामलों को अपवाद फिल्टर संभाल सकते हैं की एक संख्या हैं। उदाहरण के लिए:

  • नियंत्रक कन्स्ट्रक्टर से निकाले गए अपवाद।
  • संदेश हैंडलरों से निकाले गए अपवाद।
  • रूटिंग के दौरान निकाले गए अपवाद।
  • प्रतिक्रिया सामग्री क्रमिकरण के दौरान निकाले गए अपवाद।

अपवाद संचालक या लकड़हारा रजिस्टर और उचित कार्रवाई:

हम दो नए उपयोगकर्ता द्वारा बदलने सेवाओं, IExceptionLogger और IExceptionHandler, लॉग इन करें और अपवाद बिना क्रिया को संभालने के लिए प्रदान करते हैं। सेवाएं दो समान अंतरों के साथ बहुत समान हैं: हम एकाधिक अपवाद लॉगर्स पंजीकृत करने का समर्थन करते हैं लेकिन केवल एक अपवाद हैंडलर।

  1. अपवाद लॉगर्स हमेशा कॉल करते हैं, भले ही हम कनेक्शन को रद्द करने वाले हैं।
  2. अपवाद हैंडलर केवल तब कॉल किए जाते हैं जब हम अभी भी कौन सा प्रतिक्रिया संदेश भेजना चुन सकते हैं।

दोनों के कार्यान्वयन के लिए this answer in How do I log ALL exceptions globally for a C# MVC4 WebAPI app? देखें।

आप निश्चित रूप से भी अपने नियंत्रक में गणनीय अमल में लाना कर सकते हैं, अपवाद के कारण वहाँ फेंक दिया और अपवाद फ़िल्टर द्वारा नियंत्रित किया जा करने के लिए:

var result = list.Select(a => GetData(a)).ToList(); 
संबंधित मुद्दे