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 ...
随机推荐
- Tabindex
1.tabindex 属性可以设置键盘中的TAB键在控件中的移动顺序,及焦点的顺序 2. tabindex 属性值范围在1到32767之间 3. 默认的 tabindex 的值为 0 ,将排在所有指定 ...
- Linux 的su 与sudo 的区别,查看所有用户
首先,我们要知道系统当中存在哪些用户. 1.用户名和密码的存储位置 存储帐号的文件:/etc/passwd 存储密码的文件:/etc/shadow 通过/etc/shadow获取的只是密码加密后的Ha ...
- Mac系统操作指南
OSX 采用的Unix文件系统,所有文件都挂在跟目录“ /” 下面,所以不在要有Windows 下的盘符概念.比如什么“C:”你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做“XX” ...
- 提示"libc.so.6: version `GLIBC_2.14' not found"
启动php 提示"libc.so.6: version `GLIBC_2.14' not found",原因可能是glibc版本太低,php使用了较高的glibc版本引起的 1,首 ...
- 初识Spark程序
执行第一个spark程序 普通模式提交任务: bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark ...
- leetcode BFS
1. word ladder class Solution { public: int ladderLength(string beginWord, string endWord, unordered ...
- Java实例---简单的个人管理系统
代码分析 FileOperate.java package com.ftl.testperson; import java.io.File ; import java.io.FileInputStre ...
- 深入浅出SharePoint2013——使用沙箱解决方案
启用“Microsoft SharePoint Foundation Sandboxed Code Service”后,我们就可以使用Sandboxed solution了.
- December 20th 2016 Week 52nd Tuesday
With the wonder of your love, the sun above always shines. 拥有你美丽的爱情,太阳就永远明媚. To accept the love from ...
- MAC软件工具下载
CRThttps://www.cnblogs.com/codegeekgao/p/8277015.html navicathttp://xclient.info/search/s/navicat/?t ...