7.2WebApi2中的全局异常处理
现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常。一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的。例如:
- 从控制器的构造函数引发的异常。
- 从消息处理程序引发的异常。
- 在路由过程中引发的异常。
- 在响应内容序列化期间引发的异常。
我们需要提供简单、 一致的方式来记录和处理 (如果可能) 这些异常。
处理异常有两种方式,其中一种我们可以发送一个错误响应;另外一种我们可以在那里记录日志异常,举个例子就是引发异常是在响应流的内容时,在这个时候处理就太晚了,因为这时响应码,标题和部分响应内容已经在传输上了,所以我们只是中断连接发送响应消息。即使不能处理该异常,我们仍能记录异常日志,在那里我们可以检测到错误的情况下,返回相应的错误响应,如下所示:
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
现有的选项
解决方案概述
我们提供两个用户可更换的服务, IExceptionLogger和 IExceptionHandler,来记录和处理未处理的异常。服务是很相似,但是也有两个主要区别 ︰
- 我们支持注册多个异常记录器,但只有一个单一的异常处理程序。
- 异常的记录器总是会调用,即使我们要中止连接。异常处理程序只会调用时我们仍然能够以选择要发送的响应消息。
这两种服务提供访问异常上下文包含异常检测到的点、 特别是HttpRequestMessage、 HttpRequestContext、 抛出的异常和异常源 (细节如下) 的相关信息。
设计原则
1.没有重大更改
因为在次要版本中,一个重要的制约因素影响的解决方案是,有没有重大的更改,或者键入合同或行为正在添加此功能。此约束排除我们想在现有车削成 500 反应异常的 catch 块做了一些清理。这额外的清理是我们可能会考虑后续的主要版本。如果这是重要的您在ASP.NET Web API 用户声音请投票.
2.保持一致性与 Web API 构建
Web API 的滤清器管道是一个伟大的方式来处理横切关注点的逻辑在特定操作、 控制器具体或全球范围内的应用灵活性。过滤器,包括异常筛选器,总是有行动和控制器的情况下,即使在全球范围内注册。合同有道理的筛选器,但它意味着异常筛选器,甚至全球范围的不是很好的适合一些异常处理情况下,如异常从消息处理程序,在没有行动或控制器的上下文存在。如果我们想要使用所筛选的异常处理提供灵活的范围,我们仍然需要异常筛选器。但如果我们需要处理异常控制器上下文之外,我们还需要一个单独的构造全全局错误处理 (东西没有控制器上下文和操作上下文约束)。
何时使用
- 异常的记录器是见到所有未处理的异常被 Web API 的解决方案。
- 异常处理程序是用于自定义所有可能响应未处理的异常被 Web API 的解决方案。
- 异常筛选器是最简单的解决方案,针对有关的具体行动或控制器子集未处理的异常处理。
服务详细信息
异常日志记录器和处理程序服务接口是简单的异步方法以各自的具体情况 ︰
public interface IExceptionLogger
{
Task LogAsync(ExceptionLoggerContext context,
CancellationToken cancellationToken);
} public interface IExceptionHandler
{
Task HandleAsync(ExceptionHandlerContext context,
CancellationToken cancellationToken);
}
我们也为这两种接口提供基类,这些类。重写核心 (同步或异步) 方法是登录或在推荐处理所需的全部时间。日志记录, ExceptionLogger基类将确保核心测井方法只一次呼吁每个例外 (即使它后来传播进一步向上调用堆栈和再次抓住)。ExceptionHandler 基类将调用核心处理方法仅用于顶部的调用堆栈,忽略遗留的嵌套的 catch 块的异常情况。(下面附录中的这些基类简化的版本)。
IExceptionLogger 和IExceptionHandler 收到异常有关的信息通过ExceptionContext.
public class ExceptionContext
{
public Exception Exception { get; set; } public HttpRequestMessage Request { get; set; } public HttpRequestContext RequestContext { get; set; } public HttpControllerContext ControllerContext { get; set; } public HttpActionContext ActionContext { get; set; } public HttpResponseMessage Response { get; set; } public string CatchBlock { get; set; } public bool IsTopLevelCatchBlock { get; set; }
}
7.2WebApi2中的全局异常处理的更多相关文章
- SpringBoot中的全局异常处理
SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...
- 在.NET Core程序中设置全局异常处理
以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...
- Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)
目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...
- WEB 项目中的全局异常处理
在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...
- 【5min+】AspNet Core中的全局异常处理
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- ASP.NET Core MVC 中设置全局异常处理方式
在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...
- Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- UWP 中的全局异常处理
问题 在开发一款应用的过程中,我们开发者很难考虑到所有问题,往往会忘记处理一些可能发生的异常.随之而来的结果就是用户使用过程中接连不断的崩溃.所以,我们有必要处理所有未被我们处理的异常. 本文介绍了 ...
- MVC 全局异常处理及禁用显示头
MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...
随机推荐
- 纯java配置SpringMVC
一般情况下,我们会在web.xml下配置好Spring和SpringMVC,并指定好它们的配置文件 是最常用的也是最方便的方法 例如: web.xml <!-- The definition o ...
- android第一行代码-5.监听器的两种用法和context
监听器的两种用法 1.匿名函数设置监听器 public class MainActivity extends Activity { private Button button; @Override p ...
- vuejs mvvm图解
- WebService基本使用
不使用任何框架,纯粹使用JDK开发一个服务端与客户端 服务端 package org.zln.ws.server;import org.slf4j.Logger;import org.slf4j.Lo ...
- __definedGetter\Setter__的一些想法
__definedGetter\Setter__ 是JS5在创建对象后内置的方法,用于在读写对象属性的时候执行的方法. zhangmingzhi.__defineSetter__('age',func ...
- docker-compose启动的tomcat无法远程连接jmx
最近想学习下java GC优化,就用了一下VisualVM,在远程服务器启动了一个非docker的tomcat,很顺利的就连接了,但是用docker-compose启动的服务却 怎么也连不上,一定是d ...
- javascript正则表达式:匹配所有html标签
此正则表达式收集于网络,但那个网站连复制一下都需要注册会员,鄙视之,所以不提他了.而且,原作者也不可能是那个网站. html标签有<h1></h1>这种成对的,也有<br ...
- Webpack学习笔记一:What is webpack
#,Loaders干嘛的,webpack can only process JavaScript natively, but loaders are used to transform other ...
- 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II
好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...
- FPGA与simulink联合实时环路系列—开篇
FPGA与simulink联合实时环路系列—开篇 作为网络上第一个开源此技术,笔者迫不及待地想将此技术分享出来,希望大家多多支持.笔者从2011年接触FPGA以来,从各个方面使用FPGA,无论是控制. ...