点这里进入ABP系列文章总目录javascript
基于DDD的现代ASP.NET开发框架--ABP系列之2三、ABP展示层——异常处理
html
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。java
ABP的官方网站:http://www.aspnetboilerplate.comgit
ABP在Github上的开源项目:https://github.com/aspnetboilerplategithub
在 web 应用程序中,异常一般是在 MVC Controller actions 和 Web API Controller actions 中被处理的。当异常发生时,应用程序用户被以某种方式告知该错误和该错误产生的可选缘由(就是列举出产生该异常的多种缘由,产生错误的缘由多是列举出的一种也多是多种。)web
若是一个常规的HTTP请求产生错误,那么一个错误页面会展现。若是AJAX请求产生错误,服务器端会发送错误消息到客户端,而后客户端处理并显示该错误给用户。ajax
在全部的Web请求中处理异常是一个单调乏味而且重复性的工做。然而在ABP中,你几乎不需为任何异常的指定明确的异常处理,ABP会自动的记录这些异常而且以适当的格式作出响应返回到客户端。也就是说,在客户端处理这些响应而且将错误详细显示给客户。api
为了开启错误处理, customErrors 必须设置以下:服务器
<customErrors mode="On" />
也能够设置 'RemoteOnly' 若是你不想在本地处理这些错误。架构
若是不是Ajax 请求,那么将会显示一个错误页面。
MVC Controller action抛出了一个异常,以下所示:
public ActionResult Index() { throw new Exception("A sample exception message..."); }
固然,这个异常可以被指定调用的action中的另外的方法抛出。ABP处理这个异常,记录异常信息而且显示'Error.cshtml' 视图。你可以自定义这个视图来显示该错误。example 错误视图(这个视图是ABP中缺省错误视图模板)。
ABP 隐藏了异常的详细信息,而是向用户展现了一个标准的(本地化的,友好化的)错误信息。除非你明确指定抛出一个UserFriendlyException 异常。
UserFriendlyException是一个特殊的异常类型,被用来直接的显示给用户。请看下面示例:
public ActionResult Index() { throw new UserFriendlyException("Ooppps! There is a problem!", "You are trying to see a product that is deleted..."); }
ABP记录这个异常而且不隐藏此次的异常信息:
因此,若是你想显示一个特殊的错误信息给用户,你只须要抛出一个UserFriendlyException(或者一个派生自该异常类的类型,也就是说继承这个异常类的子类)。
ABP传递一个ErrorViewModel 对象给Error视图:
public class ErrorViewModel { public AbpErrorInfo ErrorInfo { get; set; } public Exception Exception { get; set; } }
ErrorInfo 包含了可以显示给客户的详细的异常信息。Exception 对象就是那个被抛出的异常。你可以核实异常而且附加自定义信息来显示,若是你想这样作的话。例如:咱们可以核实该异常是不是一个AbpValidationException。
若是请求是一个AJAX请求,ABP会返回一个JSON对象到客户端。ASP.NET MVC Controllers 和 ASP.NET Web API Controllers 也是这么处理的。以JSON方式返回一个异常信息,请看下面示例:
{ "targetUrl": null, "result": null, "success": false, "error": { "message": "An internal error occured during your request!", "details": "..." }, "unAuthorizedRequest": false }
success: false 表示有一个错误发生。error对象提供了错误信息和错误的详细描述。
当你在客户端用ABP的基础设施来作一个AJAX请求时,它会用message API自动的处理这个JSON对象而且显示错误信息给用户。更多信息请参照AJAX API 和dynamic web api layer。
当ABP处理任何Web请求的异常时,它会触发AbpHandledExceptionData事件,固然你必须注册该事件,而且写相应的处理代码。详细信息请参照eventbus documentation。
但愿更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目能够发展得更好。
欢迎加QQ群:
ABP架构设计交流群:134710707 ABP架构设计交流2群: 579765441