当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 入门指导 > arm webapi遇到异常怎么处理?详细步骤告诉你

arm webapi遇到异常怎么处理?详细步骤告诉你 时间:2018-07-20      来源:未知

我们都知道,webapi是作为服务器来使用的,每次客户端发送http请求到我们的WebApi服务里面,那么服务器就会把结果输到response到客户端,在这个步骤中,如果服务器发生异常,那么就会返回500的错误,那么在这个时候我们应该如何来处理这样的异常呢,在这里给你们提供一些处理异常的小技巧。

通常webapi会出现的异常一般有下面几点:Controller构造方法中出现的异常, MessageHandlers中出现的异常,路由过程中出现的异常,Body在序列化/反序列化过程中出现的异常

由于ExceptionFilter解决不了这些异常,那么为了解决这些问题,webapi还有两个针对异常记录、处理的扩展点:那就是IExceptionLogger 和IExceptionHandler。

对于这两个来说,他们是webapi管道组件进行注册管理的,他们是有不同分工的。

IExceptionHandler作为异常处理组件,负责异常发生后的处理工作,他处于异常处理管道的最末端,当IExceptionLogger组件进行一场记录完毕、没有相关的ExceptoinFilter进行异常处理时,才会最终调用ExceptionHandler进行异常处理,在Web API中,有且仅有一个ExceptionHandler进行异常的处理。

arm webapi

IExceptionLogger作为异常日志记录组件,负责异常发生后的日志记录,他贯穿于整个Web API的生命周期中,在Web API框架里,任何一个请求周期中出现任何一个未被捕获/处理的异常都会首先进入这个异常日志记录管道进行异常Log记录,在Web API中可以注册多个IExceptionLogger实例负责不同的异常处理。

在Web API框架中给出了两个基类:ExceptionLogger和ExceptionHandler,我们在使用ExceptionLogger基类时,他提供了ShouldLog虚方法,该方法在基类中被调用,其作用在于避免同一个异常被同一个ExceptionLogger实例重复记录(如当后续的管道中该异常又被抛出,或者同一个ExceptionLogger对象不小心被注册了两次就会出现重复记录的可能)我们也能复写ShouldLog方法加入我们自己的异常记录判断逻辑以针对不同的场景进行不同的ExceptionLogger调用。如果有兴趣可以反编译一下ExceptionLogger基类看看,他使用了显示接口实现,挺有意思的一个技巧。下面我们来看一个ExceptionLogger使用的例子:

public class ErroLogger : ExceptionLogger

{

public async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)

{

var sb = new StringBuilder();

//获取Log组件

ILogger log = LogManager.GetCurrentClassLogger();

var request = context.Request;

sb.AppendLine("URL:");

//获取URL

var url = request.RequestUri.ToString();

sb.AppendLine(url);

log.Error(context.Exception,sb.ToString(),"");

}

public override bool ShouldLog(ExceptionLoggerContext context)

{

return context.Exception is DemoException && base.ShouldLog(context);

}

}

在这里,我们重新写了ShouldLog,就是为了保证ExceptionLogger只记录DemoException这个类型的异常,而且他也调用了基类的方法不会重复记录同一个异常。在LogAsync方法中,我通过Log组件记录了导致异常的请求URL,也记录了异常信息。

那接下来我们就是要开始对组件来注册了:

在App_Start/WebApiConfig.cs文件中的Register方法中写入

config.Services.Add(typeof(IExceptionLogger),new ErroLogger());

这样,针对DemoException的异常记录组件就完成了,当Web API执行管道中出现未处理的DemoException异常,均会调用则个组件进行记录。

接下来我们来写一个ExceptionHandler,在整个Web API框架中,ExceptionHandler只能提供一个实例,与ExceptionLogger一样,我们可以继承ExceptionHandler基类来简化异常处理,在ExceptionHandler中也提供了ShouldHandle方法来判断该异常是否应该处理,避免重复处理管道中其他环节重复抛出的异常。我们也同样提供一个例子:

public class ErrorHandler : ExceptionHandler

{

public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)

{

if (context.Exception is DemoException)

{

context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message}));

}

else

{

context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"}));

}

}

}

在这个例子中,我们判断了异常的类型,并根据不同的异常返回客户端不同的响应内容和不同的HTTP状态码。

然后在配置中注册这个异常处理模块,在App_Start/WebApiConfig.cs文件中的Register方法中写入

config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());

这样就替换了系统默认的ExceptionHandler,可以使用我们自定义的Handler进行异常的处理了。

在异常记录、处理过程中,我们都碰到相应的异常上下文参数,我们能通过这个参数获取当前请求的上下文,获取请求、响应(小心有时会为空哦)、捕获到该异常的catch块信息等内容,我们可以利用这些信息更好地描述、记录、处理异常。

到这里ExceptionLogger组件和ExceptionHandler组件简单的开发就完成了。在开发的过程中我们可以看到,ExceptionLogger负责了全局的异常记录,在Web API框架管道下出现未处理的异常ExceptionLogger都会进行捕获、记录。而ExceptionHandler和ExceptionFilter功能是有重叠的,那么问题来了,如何使用这两个呢?下面让你清楚的了解:

arm webapi

现在你是否已经get到这些小窍门,小方法了吗,要多加练习,在出现异常时,要想到这些对于ExceptionHandler和ExceptionFilter而言,我觉得ExceptionHandler比ExceptionFilter更有优势。

上一篇:分分钟让你了解嵌入式软件系统的构成

下一篇:5个嵌入式系统的例子,都超级给力

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部