博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP理论学习之异常处理
阅读量:6244 次
发布时间:2019-06-22

本文共 2049 字,大约阅读时间需要 6 分钟。


本篇目录

介绍

在一个web应用中,异常通常是在MVC控制器的action方法和Web API控制器中处理的。当异常发生时,应用程序会通知用户发生的错误,也可能包含该错误产生的原因。

如果错误发生在一个常规的HTTP请求中,那么就会展示一个错误页面。如果一个错误发生在Ajax请求中,那么服务端会给客户端发送错误信息,然后处理后将错误展示给用户。

在所有的web应用中处理异常是一个乏味反复的工作。ABP的异常处理是自动化的。你大多数情况下不需要处理任何异常。ABP会处理所有的异常,记录异常信息日志,并返回给客户端合适且格式化的响应,而且也会在客户端处理这些响应并通知用户。

开启错误处理

要开启错误处理,必须开启customErrors模式。

如果你不想在本机上处理错误,那么你可以将该值设置成“RemoteOnly”。

非Ajax请求

如果请求是非Ajax的,那么就会显示一个错误页面。

展示异常信息

这里有个抛出任意异常的MVC控制器action。

public ActionResult Index(){    throw new Exception("A sample exception message...");}

当然,这个异常信息也可能被在该action中调用的其他方法抛出。ABP会处理这个异常,记录到日志,然后显示“Error.cshtml”视图。你也可以自定义该错误视图。一个错误视图的例子如下(它是ABP模板中默认的错误视图):

577014-20151231212223792-1292368149.png

ABP会将该异常的细节隐藏给用户,然后展示一个标准的(本地化)错误信息,除非你显示抛出一个UserFriendlyException

UserFriendlyException

UserFriendlyException是一个特殊类型的异常,它会直接展示给用户。看下面的例子:

public ActionResult Index(){    throw new UserFriendlyException("Ooppps! There is a problem!", "You are trying to see a product that is deleted...");}

ABP会记录这个错误日志,但是这次不会隐藏异常信息了,如下所示:

577014-20151231212718573-747775861.png

因此,如果你想要给用户展示一个特殊的错误信息,只要抛出一个UserFriendlyException(或者派生自它的异常)就行了。

Error模型

ABP将一个ErrorViewModel对象传给了Error视图:

public class ErrorViewModel{    public AbpErrorInfo ErrorInfo { get; set; }    public Exception Exception { get; set; }}

ErrorInfo包含了可以展示给用户的详细信息, Exception对象是抛出的异常。如果你想,你也可以检查它,然后展示额外的信息。比如,如果它是一个AbpValidationException,那么我们可以展示一个验证错误的信息:

577014-20151231213304698-1528714449.png

Ajax请求

如果请求是Ajax请求,那么ABP会返回一个Json对象给客户端。这对于MVC控制器和Web API控制器都是成立的。下面是返回一个错误对象的例子:

{  "targetUrl": null,  "result": null,  "success": false,  "error": {    "message": "An internal error occured during your request!",    "details": "..."  },  "unAuthorizedRequest": false}

success:false表明发送了错误。

error对象提供了错误 信息细节

当你使用ABP的基础设施在客户端发起Ajax请求时,客户端会自动地处理这个Json对象,然后使用message API给用户提示错误信息。

异常事件

ABP处理任何异常时都会触发AbpHandledExceptionData事件,注册该事件后就会收到通知(查看获取更多信息关于事件总线的信息)。例子:

public class MyExceptionHandler : IEventHandler
, ITransientDependency{ public void HandleEvent(AbpHandledExceptionData eventData) { //TODO: 检查 eventData.Exception! }}

如果你把这个样例类放到你的应用中(一般放到Web项目中),HandleEvent方法就会被ABP处理的所有异常调用。这样,你就可以研究Exception对象的细节了。

转载地址:http://rosia.baihongyu.com/

你可能感兴趣的文章
Suricata的所有运行方式模式(图文详解)
查看>>
1355: [Baltic2009]Radio Transmission
查看>>
kaldi的TIMIT实例三
查看>>
Prolog 逻辑推导语言
查看>>
又搬回来了233
查看>>
CentOS7下单机部署RabbltMQ环境的操作记录
查看>>
C# 编码命名规则
查看>>
centos7执行 wget命令: command not found的两种解决方法
查看>>
Win8Metro(C#)数字图像处理--2.25二值图像距离变换
查看>>
包管理和环境管理软件Anaconda
查看>>
使用curator 来管理elasticsearch的index
查看>>
manjaro折腾手记
查看>>
vue - webpack.dev.conf.js for merge
查看>>
Jvm(16),jvm创建对象---对象在内存中的创建
查看>>
Microsoft SQL Server 2005 Service fails to start
查看>>
【048】HTML 笔记
查看>>
RDA 编译器的搭建
查看>>
sqlserver重命名字段名称
查看>>
学习面试题Day07
查看>>
HttpServletRequest/HttpServletResponse乱码问题解决
查看>>