文档目录

本节内容:

简介

这个文档针对Asp.net Mvc和Web Api,如果你对Asp.net Core感兴趣,请看Asp.net Core文档。

在一个Web应用里,异常通常在Mvc控制器的Action或Web Api 控制器的Action里被处理,当一个异常姓时,应用的用户会通过某种方式收到错误信息和错误的可能原因。

如果一个错误发生在平常的HTTP请求里,会显示一个页面错误,如果一个错误发生在一个AJAX请求里,服务端把错误发给客户端,客户端负责处理和显示给用户。

在所有Web请求里,处理异常是一件乏味且重复的事情,ABP自动化了这一过程,你几乎不用显式处理任何异常,ABP处理所有异常、日志记录它们并返回对应的格式化的响应给客户端,同时在客户端处理这个响应并显示错误信息给用户。

启用错误处理

要启用ABP控制器的错误处理,customErrors的mode必须启用:

<customErrors mode="On" />

如果你不想在本地计算上处理错误,可以把它设置为“RemoteOnly”。

注意:只需要为Asp.net Mvc控制器设置这个,Web Api 和 Asp.net Core 的控制器不需要设置。

非Ajax请求

如果不是一个AJAX请求,将显示一个错误页面。

显示异常

此处,有一个Mvc控制器的Action抛出一个任意的异常:

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

当然,这个异常也会被调用这个Action的另一个方法抛出,ABP处理这个异常、日志记录它并显示“Error.cshtml”视图,你可以自定义这个视图来显示错误,一个错误视图的示例(在ABP模板里默认的Error视图):

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日志记录它但这次不隐藏异常:

所以,如果你想显示一个特殊的错误信息给用户,只要抛出一个UserFriendlyException(或继承于它的一个异常)。

Error 模型

ABP传递一个ErrorViewModel对象作为模型给Error视图:

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

ErrorInfo包含能显示给用户的错误细节信息,Exception对象就是抛出的异常,你可以核实它并显示额外的信息,例如,如果它是一个AbpValidationException,你可以显示验证错误信息:

AJAX 请求

如果Mvc的Action返回类型是JsonResult(或异步Action的Task<JsonResult>),ABP在遇到异常时,返回一个JSON对象给客户端,示例为一个错误的返回对象:

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

success:false表明它是一个错误,error对象提供了错误message(信息)和details(明细)。

当你使用ABP基础架构在客户端发送AJAX请求,它自动处理这个JSON对象,并使用message API显示错误信息给用户,更多信息查看AJAX Api

异常事件

当ABP处理任何异常时,它会触发一个AbpHandledExceptionData事件,它可被注册后并发出通知(查看事件总线文档获取更多信息),例如:

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

如果你把这个示例类加入到你的应用(通常是Web应用),当ABP处理异常时,HandleEvent方法将被调用,所以,你可以在这个方法里深入的检查这个异常。

kid1412附:英文原文:http://www.aspnetboilerplate.com/Pages/Documents/Handling-Exceptions

ABP文档 - 异常处理的更多相关文章

  1. ABP文档笔记系列

    ABP文档笔记 - 模块系统 及 配置中心 ABP文档笔记 - 事件BUS ABP文档笔记 - 数据过滤 ABP文档笔记 - 规约 ABP文档笔记 - 配置.设置.版本.功能.权限 ABP文档笔记 - ...

  2. ABP文档 - Mvc 控制器

    文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...

  3. ABP文档 - Web Api 控制器

    文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简介 通过Abp.Web. ...

  4. ABP文档 :Overall - Introduction

    介绍 我们基于不同的需求创建不同的应用,但却在一次又一次地实现相同或相似的结构.至少在某种程度上,授权.验证.异常处理.日志.本地化.数据库连接管理.配置管理.审计日志属于通用的结构. 另外我们总是在 ...

  5. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  6. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  7. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  8. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  9. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

随机推荐

  1. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  2. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  3. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  4. 【干货分享】流程DEMO-离职流程

    流程名: 离职申请   流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebService.cs   流程说明: 流程中集成了webservic ...

  5. ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id

    出现场景:当点击"分类"再返回"首页"时,发生error退出   BUG描述:Caused by: java.lang.IllegalArgumentExcep ...

  6. DevOps对于企业IT的价值

    其实从敏捷延展开的 DevOps 概念很早就已经被提出,不过由于配套的技术成熟度水平层次不齐, DevOps 的价值一直没有有效地发挥出来.现如今,随着容器技术的发展, DevOps 在企业中的实践难 ...

  7. 豪情-CSS解构系列之-新浪页面解构-01

    目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...

  8. 利用HAProxy代理SQL Server的AlwaysOn辅助副本

    利用HAProxy代理SQL Server的AlwaysOn辅助副本 公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群 机房内有三套程序需要读取数据库 第一套:主 ...

  9. 开源一个WEB版本GEF,基于SVG的网页流程图框架

    8月开始断断续续的制作这个web gef,没有任何依赖,完全原生js开发,目前已经完成了雏形,基本上可以在项目里应用了. 下图展示的是demo1的效果,包括拖拽,生成连线,点击生成\取消墙体,整个de ...

  10. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...