ASP.NET C# Catch all exceptions in a class ASP.NET C# Catch all exceptions in a class asp.net asp.net

ASP.NET C# Catch all exceptions in a class


Yes it is. The simplest way would be a Attribute for this class like this one:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public class HandleErrorAttribute : FilterAttribute, IExceptionFilter{    public void OnException(ExceptionContext filterContext)    {        if (filterContext == null)        {            throw new ArgumentNullException("filterContext");        }        if (filterContext.ExceptionHandled)        {            return;        }        var exception = filterContext.Exception;        // that need to be your current request object. In this case I use a custom one so I must fetch it from the items collection of the current request, where I had stored it before.        var request = filterContext.HttpContext.Items[Request.RequestKey] as Request;        if (request != null)        {            // overwrite ErrorResponse with a response object of your choice or write directly to the filterContext.HttpContext.Response            var errorResponse = new ErrorResponse(request, exception);             errorResponse.Write(filterContext.HttpContext.Response);            filterContext.ExceptionHandled = true;        }    }}// Or a just slightly modified version of the default ASP.Net MVC HandleError Attribute[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]    public class CustomHandleErrorAttribute : FilterAttribute, IExceptionFilter    {        // Fields        private const string _defaultView = "Error";        private string _master;        private readonly object _typeId = new object();        private string _view;        // Methods        public virtual void OnException(ExceptionContext filterContext)        {            if (filterContext == null)            {                throw new ArgumentNullException("filterContext");            }            if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))            {                Exception innerException = filterContext.Exception;                if ((new HttpException(null, innerException).GetHttpCode() == 500))                {                    string controllerName = (string)filterContext.RouteData.Values["controller"];                    string actionName = (string)filterContext.RouteData.Values["action"];                    HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);                    ViewResult result = new ViewResult();                    result.ViewName = this.View;                    result.MasterName = this.Master;                    result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model);                    result.TempData = filterContext.Controller.TempData;                    filterContext.Result = result;                    filterContext.ExceptionHandled = true;                    filterContext.HttpContext.Response.Clear();                    filterContext.HttpContext.Response.StatusCode = 500;                    filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;                }            }        }        public string Master        {            get            {                return (this._master ?? string.Empty);            }            set            {                this._master = value;            }        }        public override object TypeId        {            get            {                return this._typeId;            }        }        public string View        {            get            {                if (string.IsNullOrEmpty(this._view))                {                    return "Error";                }                return this._view;            }            set            {                this._view = value;            }        }    }

Usage (untested cause I used it in context of controller that already implement all required interfaces)

[HandleErrorAttribute]public class Foo : IExceptionFilter // (I am not sure about this one IActionFilter){    public void MethodA()     {        // body    }    public void MethodB()     {        // body    }    public void MethodC()    {        // body    }}

Or you can do something like this:

public class ExecuteHelper{    public static void Catch(Action action)    {        try        {            action();        }        catch (Exception ex)        {            // Do what you want        }    }}

And use it in a Function body:

public void Foo(string something){    ExecuteHelper.Catch(() =>    {        // Do something with something or without something    });}


You could write a higher order function to handle the exceptions, which would make it somewhat cleaner.

private T FooExceptionHandler(Func<T> function){   try   {      return function();   }   catch   {      //handle it   }}

You can replace Func with Action if you don't have a return value.You can use it in two ways, outside of the function:

FooExceptionHandler(MethodA);

or inside each function:

MethodA(){   return FooExceptionHandler(()=>      {         //Function body goes here      });}


No, there isn't. try/catch blocks can only occur in methods. You could use some sort of AOP framework however to automatically generate those blocks. postcrap is a pretty lightweight AOP component.