声明:本方式及代码只使用与.NET Web API.

先创建类继承ExceptionFilterAttribute类型并复写OnException方法。

代码如下:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Web.Http.Filters;
using FrameWork.Common;
using FrameWork.Common.Const; namespace FrameWork.Web.Handle
{
/// <summary>
/// 处理错误信息
/// </summary>
public class ErrorHandleAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext filterContext)
{
// 错误处理
base.OnException(filterContext);
var sb = new StringBuilder();
sb.AppendLine("参数:"+ GetExceptionMessage(filterContext));
sb.AppendLine("异常内容:"+ filterContext.Exception.ToJson());
Log4NetHelp.Error(sb.ToString());
filterContext.Response = GetResponse(sb.ToString());
} /// <summary>
/// 处理错误信息为方便开发人员阅读的格式,包括接口地址以及参数
/// </summary>
/// <param name="actionExecutedContext">异常内容</param>
private string GetExceptionMessage(HttpActionExecutedContext actionExecutedContext)
{
var session = System.Web.HttpContext.Current.Session;
var request = System.Web.HttpContext.Current.Request;
var guid = Guid.NewGuid().ToString();
var task = actionExecutedContext.ActionContext.Request.Content.ReadAsStreamAsync();
var content = string.Empty;
try
{
var sm = task.Result;
if (sm != null)
{
sm.Seek(, SeekOrigin.Begin);
var len = (int)sm.Length;
var inputByts = new byte[len];
sm.Read(inputByts, , len);
sm.Close();
content = Encoding.UTF8.GetString(inputByts);
sm.Close();
}
}
catch (Exception e)
{
return e.Message;
} var sessionId = session == null ? "" : session.SessionID;
var pars = string.Format("error:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n content = {2};"
, sessionId
, request.RawUrl
, content
, guid
, request.ContentType); return pars;
} /// <summary>
/// 处理错误信息后执行的方法
/// </summary>
/// <param name="mes">错误信息</param>
private HttpResponseMessage GetResponse(string mes)
{
return JsonHelper.ToJson(new
{
Info = CommonConst.FailStr,
Message = mes,
Msg = false,
ResultCode = CommonConst.FailCode
});
}
}
}

如何使用呢?

只需要在需要捕捉异常的控制器加上[ErrorHandle]即可。

例如:

    [ErrorHandle]
public abstract class AdminControllerBase : Controller
{
//代码逻辑
}

如果继承AdminControllerBase或者带有[ErrorHandle]特性的类和方法出现了错误,都会执行OnException方法。

可以在处理异常的方法里面加上自己想要的逻辑处理。

也可以直接在WebApiConfig.cs文件中加上

 config.Filters.Add(new WebApiErrorHandleAttribute());

这样就是全局捕捉异常了,只要接口内部没有try…catch,那么其他所有的异常都会捕捉到。

.NET WebAPI 利用特性捕捉异常的更多相关文章

  1. .NET [MVC] 利用特性捕捉异常

    声明:本代码只适用于.NET MVC. 先创建一个类继承ActionFilterAttribute这个抽象类以及实现IExceptionFilter接口,并实现它的方法OnException. 代码如 ...

  2. .NET Core[MVC] 利用特性捕捉异常

    声明:本方式适用于MVC.本代码只适用于.NET Core MVC. 先创建一个类继承ExceptionFilterAttribute这个抽象类,并override它的方法OnException. 代 ...

  3. 如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求

    在方法上贴上attribute(特性)捕捉方法的异常,其实这么做也是为了在项目中不会大量使用try-cacth这样的语句,同时使我们的代码看起来更简洁,更直观,将逻辑业务分离使得后期维护方便.这里我们 ...

  4. MVC 应用程序级别捕捉异常

    捕捉异常: using System; using System.IO; using System.Net; using System.Net.Http; using System.Net.Http. ...

  5. C#开发---利用特性自定义数据导出到Excel

    网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据  1.在NuGet上安装Aspose.Cells或 ...

  6. webapi 利用webapiHelp和swagger生成接口文档

    webapi 利用webapiHelp和swagger生成接口文档.均依赖xml(需允许项目生成注释xml) webapiHelp:微软技术自带,仅含有模块.方法.请求-相应参数的注释. swagge ...

  7. MVC WebAPI框架里设置异常返回格式统一

    webApi里设置全局异常返回格式今天为了设置api返回格式统一,在网上找了一推资料,各种资料参差不齐的,最后自己捣鼓,终于弄出来了,直接上代码 /// <summary> /// 消息代 ...

  8. ABP捕捉异常错误代码

    在服务层或者CORE层  随便哪里都可以  创建一个捕捉异常的文件夹  里面写一个LonsidException类 继承后面的接口  然后重写继承的方法  这样在ABP项目运行阶段  无论在哪里出现异 ...

  9. zzw原创_oracle循环中的异常捕捉_捕捉异常后并继续循环

    例子如下 set serveroutput on; declare   V_SQL VARCHAR2(255);   errorCode number; --异常编码     errorMsg var ...

随机推荐

  1. Linux 搭建 Nginx+PHP-FPM环境

    安装PHP.Nginx和PHP-FPM sudo apt-get install php sudo apt-get install nginx sudo apt-get install php7-fp ...

  2. flink入门实例-Windows下本地模式跑SocketWordCount

    一般情况下,开发大数据处理程序,我们希望能够在本地编写代码并调试通过,能够在本地进行数据测试,然后在生产环境去跑“大”数据. 一.nc工具 配置windows的nc端口,在网上下载nc.exe(htt ...

  3. macOS实现视频转音频以及音频拼接

    macOS实现视频转音频以及音频拼接 ffmpeg 的安装 终端输入以下指令: brew install ffmpeg 视频转音频 终端输入以下指令: ffmpeg -i 视频名称.flv -vn - ...

  4. Servlet 监听器Listner

    定义:      专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动. Servlet 规范为每种事件监听器都定义了相应的接口,它用于监听 ...

  5. 亿级SQL Server运维的最佳实践PPT分享

    这次分享是我在微软的一次分享,关于SQL Server运维最佳实践的部分,由于受众来自不同背景,因此我让分享在一个更加抽象的角度进行,PPT分享如下: 点击这里进行下载

  6. 流媒体协议(一):HLS 协议

    一.HLS 概述 HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输.目前HLS协议被广泛的应用于视频点播 ...

  7. #Java学习之路——基础阶段(第九篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  8. [Swift]LeetCode462. 最少移动次数使数组元素相等 II | Minimum Moves to Equal Array Elements II

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...

  9. HBase篇--HBase常用优化

    一.前述 HBase优化能够让我们对调优有一定的理解,当然企业并不是所有的优化全都用,优化还要根据业务具体实施. 二.具体优化 1.表的设计  1.1 预分区 默认情况下,在创建HBase表的时候会自 ...

  10. java设计模式(1)---总则

    设计模式总则 一.概述 1.什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类. ...