在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(未在控制器中捕获)的情况下执行某些操作。

ExceptionFilterAttributeinheritance自System.Attribute而不是System.Exception

MSDN参考

为什么你没有得到编译器错误我不太确定。

编辑

filter允许您在各个点挂接到ASP.NET管道以编写处理事件的代码。 exception处理就是一个很好的例子。

如果您还需要自定义exception,那么您可以创建一个额外的类,例如public class BALException : Exception虽然按照描述查看您的用例,但您可能能够使用现有的框架exception。

我完全清楚你为什么要把它扔进原始post中写的工作流程的正常执行中。