webapi 异常处理
参考:https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/error-handling/exception-handling
①HttpResponseException
HttpResponseException类型是一种特殊情况。 此异常将返回异常构造函数中指定任何 HTTP 状态代码。 例如,以下方法将返回 404,找不到,如果id参数无效。
这个异常并不会触发我们的异常过滤器
[HttpGet]
public async Task<IHttpActionResult> GetTest()
{
HttpResponseMessage resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent("没有找到ID值")
};
//这并不会触发我们的异常过滤器,他会直接返回
throw new HttpResponseException(resp);
}

②异常筛选器
您可以自定义 Web API 通过编写处理异常的方式异常筛选器。 异常筛选器时,控制器方法引发任何未处理的异常时执行不 HttpResponseException异常。 HttpResponseException类型是一种特殊情况,因为它专为返回的 HTTP 响应。
异常筛选器实现System.Web.Http.Filters.IExceptionFilter接口。 编写异常筛选器的最简单方法是从派生System.Web.Http.Filters.ExceptionFilterAttribute类并重写OnException方法。
public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
public override Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
object obj = new
{
errcode = -,
errmsg = actionExecutedContext.Exception
};
actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented)
{
Content = new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
}; //可以根据具体情况判断
//if (actionExecutedContext.Exception is NotImplementedException)
//{
// actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented)
// {
// Content = new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
// };
//}
//else
//{
// actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
//}
return base.OnExceptionAsync(actionExecutedContext, cancellationToken);
}
}
放在我们的控制器上面:

[HttpGet]
public async Task<IHttpActionResult> GetTest2()
{
//主动抛出异常
throw new NotImplementedException("代码出错");
}
[HttpGet]
public async Task<IHttpActionResult> GetTest3()
{
//自动处理异常
string a = "a";
int i = int.Parse(a);
return await Task.FromResult(Ok(""));
}


③HttpError
HttpError对象提供一致的方法来响应正文中返回的错误信息。 下面的示例演示如何返回 HTTP 状态代码 404 (找不到) 与HttpError响应正文中。也是直接返回内容,并不会触发异常。
[HttpGet]
public async Task<IHttpActionResult> GetTest4()
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "错了脆了"));
}

全局异常:下面的异常也无法捕捉
1.从控制器的构造函数引发的异常。
2.从消息处理程序引发的异常。
3.在路由期间引发的异常。
4.响应内容序列化期间引发的异常。
④IExceptionLogger(异常记录器)和 IExceptionHandler(异常处理程序)
异常记录器是查看所有未处理的异常捕获到由 Web API 的解决方案。
异常处理程序是用于自定义所有可能的响应未经处理的异常捕获到由 Web API 的解决方案。
异常筛选器是最简单的解决方案用于处理与特定操作或控制器相关的子集未经处理的异常。
这里我们用IExceptionHandler来完成我们的异常的处理。
创建我们的异常类
public class MyExceptionHandler : ExceptionHandler
{
public override Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
{
object obj = new
{
errcode = -,
errmsg = context.Exception
};
context.Result = new MyErrorResult
{
Request = context.ExceptionContext.Request,
Content =JsonConvert.SerializeObject(obj)
};
return base.HandleAsync(context, cancellationToken);
}
} public class MyErrorResult : IHttpActionResult
{
public HttpRequestMessage Request { get; set; } public string Content { get; set; } /// <summary>
/// 执行
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response =
new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content = new StringContent(Content, Encoding.UTF8, "application/json");
response.RequestMessage = Request;
return Task.FromResult(response);
} }
注册全局: WebApiConfig中
// Web API 配置和服务
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
效果跟上面是一样的

webapi 异常处理的更多相关文章
- C#进阶系列——WebApi 异常处理解决方案
前言:上篇C#进阶系列——WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP 的时候 ...
- C#进阶--WebApi异常处理机制
其实对于C#异常处理大家都不陌生,但是对于在WeiApi上的异常处理实际上也和传统异常处理区别不大,但是却经过封装可以让异常更加友好,https://docs.microsoft.com/en-us/ ...
- webapi框架搭建-webapi异常处理
webapi框架搭建系列博客 前言 上一篇我们已经完成了项目的日志管理,在项目开发中日志会经常记录程序中的异常,供后续问题排查使用.本篇讲如何在webapi里加入异常处理机制. 目的和原则 1.程序任 ...
- C#进阶系列——WebApi 异常处理解决方案(转)
出处:http://www.cnblogs.com/landeanfen/p/5363846.html 阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异 ...
- (转)C# WebApi 异常处理解决方案
原文地址:http://www.cnblogs.com/landeanfen/p/5363846.html 一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发 ...
- WebApi 异常处理解决方案
1.继承ExceptionFilterAttribute类,重写OnException方法 public class WebApiExceptionFilterAttribute : Exceptio ...
- Asp.net WebApi 异常处理解决方案
一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发送http请求到我们的WebApi服务里面,服务端得到结果输出response到客户端.这个过程中,一旦服务 ...
- C#进阶系列——WebApi异常处理解决方案
阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异常信息 三.返回HttpError 四.总结 正文 为什么说是实践?因为在http://www.asp. ...
- Exception Handling in ASP.NET Web API webapi异常处理
原文:http://www.asp.net/web-api/overview/error-handling/exception-handling This article describes erro ...
随机推荐
- JavaScript自定义字符串格式化
在JS中没有字符串拼接的方法,如过要使用怎么办呢?这时我们可以通过字符串的prototype可以自定义方法. <script> String.prototype.format = func ...
- mysql中LOCATE和CASE WHEN...THEN...ELSE...END结合用法
之前项目中需要写一个sql,就是查出某个调研详情中,选A答案,B答案,C答案...F答案的人各有多少人,这个sql也是费了很大的力气才写出来,故记下来,方便以后使用. 其中tbl_research_i ...
- is_array判断是否为数组
if(is_array($arr)){ echo "是数组"; }else{ echo "不是数组"; }
- Android Weekly Notes Issue #244
Android Weekly Issue #244 February 12th, 2017 Android Weekly Issue #244 本期内容包括: Android Fragments使用教 ...
- Angular之 Scope和 Directive
---------------------------Scope-------------------------------- https://docs.angularjs.org/guide/sc ...
- 3 使用selenium模拟登录csdn
之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复 ...
- PRINCE2的优势有哪些?
PRINCE2之所以迅速发展的原因之一是许多企业认识到建立适合自己企业的项目管理标准是一项耗时耗财的工作. 他们至少要花费6-12个月.成千上万个工时来建立一套方法,而这只是最初的成本. 之后他们必须 ...
- Eclipse 中出现红色下划波浪线与红色感叹号
一直用eclipse写Python,老是看到一些字符串都给出红色波浪线, 看着就不舒服.弄了老半天终于消除了,原来是拼写检查 Windows->Preferences->General-& ...
- awk 正则表达式、正则运算符详细介绍
前言:使用awk作为文本处理工具,正则表达式是少不了的. 要掌握这个工具的正则表达式使用.其实,我们不必单独去学习它的正则表达式.正则表达式就像一门程序语言,有自己语法规则已经表示意思. 对于不同工具 ...
- leetcode Ch2-Dynamic Programming II
一. Longest Valid Parentheses 方法一.一维DP class Solution { public: int longestValidParentheses(string s) ...