WebApi 打个Attribute 统一处理异常
Posted lee576
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebApi 打个Attribute 统一处理异常相关的知识,希望对你有一定的参考价值。
我们处理异常的时候通常都要写形如以下的代码
try
xxxxx
catch(Exception ex)
log.write(ex.Message)
前一段时间看杨中科的视频,其中吐糟了 mvc 的管道机制,当然用在web ui 的渲染上这个还不如做个前后端分离,因为用管道和razor视图引擎去做这些看着就很繁琐,并且很重,整个架构都复杂化了,但是作为一些AOP的处理,管道却非常的好用,下面用一个Atrribute异常过滤器来统一的处理异常,那么每次有异常出现就不用写如上的代码去手动捕获了
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Web.Http.Filters;
namespace HenryMes.WebApi.App_Start
/// <summary>
/// 异常处理
/// </summary>
public class OnErrorResponseAttribute : ExceptionFilterAttribute
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public override void OnException(HttpActionExecutedContext context)
var error = string.IsNullOrEmpty(context.Exception.InnerException?.Message) ? context.Exception.Message : context.Exception.InnerException?.Message;
Utils.LogHelper.GetInstance().Error($@"/context.ActionContext.ControllerContext.ControllerDescriptor.ControllerName/context.ActionContext.ActionDescriptor.ActionName : error");
if (context.Exception is NotImplementedException)
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
else if (context.Exception is TimeoutException)
var errorObj = new ErrowMessage() Result = false, Message = "API调用超时" ;
context.Response = new HttpResponseMessage() StatusCode = HttpStatusCode.RequestTimeout, Content = new ObjectContent(typeof(ErrowMessage), errorObj, new JsonMediaTypeFormatter(), "application/json") ;
//.....这里可以根据项目需要返回到客户端特定的状态码。如果找不到相应的异常,统一返回服务端错误500
else
var errorObj = new ErrowMessage() Result = false, Message = error ;
context.Response = new HttpResponseMessage() StatusCode = HttpStatusCode.BadRequest, Content = new ObjectContent(typeof(ErrowMessage), errorObj, new JsonMediaTypeFormatter(), "application/json") ;
base.OnException(context);
/// <summary>
///
/// </summary>
public class ErrowMessage
/// <summary>
///
/// </summary>
public bool Result set; get;
/// <summary>
///
/// </summary>
public string Message set; get;
以上就是一个异常处理的过滤器,下面的Contronlller只用打上一个标签就不用再去写 try catch 了
/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[OnErrorResponse]
public IHttpActionResult Test()
var aaa = 999;
var b = 333;
b = 0;
var c = aaa / b;
return null;
以上是关于WebApi 打个Attribute 统一处理异常的主要内容,如果未能解决你的问题,请参考以下文章
基于.Net Framework 4.0 Web API开发:ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现