在Web API中使用ExceptionFilterAttribute
我试图在创建的Web API中实现error handling,需要以JSON格式返回exception详细信息。 我创建了BALExceptionFilterAttribute之类的
public class BALExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { base.OnException(actionExecutedContext); actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { error = actionExecutedContext.Exception.Message }); } }
并在Gloal.asax.cs中注册了它们
GlobalConfiguration.Configuration.Filters.Add(new BALExceptionFilterAttribute());
在我的控制器中,我想抛出exception
[HttpGet] [BALExceptionFilter] public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT) { if (string.IsNullOrEmpty(ROOM) { return Request.CreateResponse(new { error = "Input paramete cannot be Empty or NULL" }); } //throws the exception throw new BALExceptionFilterAttribute(); List prms = new List(); List selectionStrings = new List(); prms.Add(new OracleParameter("ROOM", OracleDbType.Varchar2, ROOM, ParameterDirection.Input)); prms.Add(new OracleParameter("DOB_GT", OracleDbType.Date, DOB_GT, ParameterDirection.Input)); string connStr = ConfigurationManager.ConnectionStrings["TGSDataBaseConnection"].ConnectionString; using (OracleConnection dbconn = new OracleConnection(connStr)) { DataSet userDataset = new DataSet(); var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = :ROOM and DOB > :DOB_GT "; var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); ContentDispositionHeaderValue contentDisposition = null; if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition)) { response.Content.Headers.ContentDisposition = contentDisposition; } return response; } }
但它在throw new BALExceptionFilterAttribute();
上显示错误throw new BALExceptionFilterAttribute();
Error 1 The type caught or thrown must be derived from System.Exception
//throws the exception throw new BALExceptionFilterAttribute();
这将产生编译器错误。 exceptionfilter属性是在exception事件中执行某些操作,因此您可以以通用方式处理它,例如重定向到错误页面或在json响应中发回一般exception消息等。exceptionfilter属性本身不是一个例外,它处理exception。
所以throw new BALExceptionFilterAttribute();
无效,因为BALExceptionFilterAttribute
不是例外。
如果你想要一个BALException
类型,那么创建一个。
public class BALException : Exception { /* add properties and constructors */}
现在你可以抛出它
throw new BALException();
然后,您可以配置BALExceptionFilterAttribute
以便在此exception到达filter(未在控制器中捕获)的情况下执行某些操作。
ExceptionFilterAttribute
inheritance自System.Attribute
而不是System.Exception
。
MSDN参考
为什么你没有得到编译器错误我不太确定。
编辑
filter允许您在各个点挂接到ASP.NET管道以编写处理事件的代码。 exception处理就是一个很好的例子。
如果您还需要自定义exception,那么您可以创建一个额外的类,例如public class BALException : Exception
虽然按照描述查看您的用例,但您可能能够使用现有的框架exception。
我完全清楚你为什么要把它扔进原始post中写的工作流程的正常执行中。