ABP理论学习之异常处理

简介:

本篇目录

介绍

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

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

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

开启错误处理

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

<customErrors mode="On" />

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

非Ajax请求

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

展示异常信息

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

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

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

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请求

如果请求是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事件,注册该事件后就会收到通知(查看事件总线(EventBus)获取更多信息关于事件总线的信息)。例子:

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

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





本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/ABPException.html,如需转载请自行联系原作者

目录
相关文章
|
12月前
|
SQL 监控 关系型数据库
MySQL怎么全局把一张表的数据回滚
MySQL怎么全局把一张表的数据回滚
1033 2
|
算法 Java 开发者
《黑神话:悟空》Xbox版的技术挑战与解决方案
【8月更文第26天】《黑神话:悟空》是一款备受期待的动作角色扮演游戏,以其精美的画面和丰富的中国神话故事背景而闻名。本篇文章将重点介绍游戏在Xbox平台上的技术挑战及其解决方案,特别是针对内存管理的问题。通过深入分析,我们将了解开发团队是如何克服这些挑战,确保游戏在Xbox上能够流畅运行的。
425 4
|
10月前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
913 1
NET任务调度框架Hangfire使用指南
|
11月前
|
SQL 机器学习/深度学习 分布式计算
Spark快速上手:揭秘大数据处理的高效秘密,让你轻松应对海量数据
【10月更文挑战第25天】本文全面介绍了大数据处理框架 Spark,涵盖其基本概念、安装配置、编程模型及实际应用。Spark 是一个高效的分布式计算平台,支持批处理、实时流处理、SQL 查询和机器学习等任务。通过详细的技术综述和示例代码,帮助读者快速掌握 Spark 的核心技能。
475 6
|
11月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
402 1
|
12月前
|
分布式计算 大数据 Apache
利用.NET进行大数据处理:Apache Spark与.NET for Apache Spark
【10月更文挑战第15天】随着大数据成为企业决策和技术创新的关键驱动力,Apache Spark作为高效的大数据处理引擎,广受青睐。然而,.NET开发者面临使用Spark的门槛。本文介绍.NET for Apache Spark,展示如何通过C#和F#等.NET语言,结合Spark的强大功能进行大数据处理,简化开发流程并提升效率。示例代码演示了读取CSV文件及统计分析的基本操作,突显了.NET for Apache Spark的易用性和强大功能。
291 1
|
12月前
|
缓存 测试技术 C#
使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
【10月更文挑战第20天】本文介绍了使用 Radzen Blazor 组件库开发基于 ABP 框架的炫酷 UI 主题的步骤。从准备工作、引入组件库、设计主题、集成到 ABP 框架,再到优化和调试,详细讲解了每个环节的关键点和注意事项。通过这些步骤,你可以打造出高性能、高颜值的应用程序界面。
394 1
|
消息中间件 Java 关系型数据库
Spring事务与分布式事务
这篇文档介绍了事务的概念和数据库事务的ACID特性:原子性、一致性、隔离性和持久性。在并发环境下,事务可能出现更新丢失、脏读和不可重复读等问题,这些问题通过设置事务隔离级别(如读未提交、读已提交、可重复读和序列化)来解决。Spring事务传播行为有七种模式,影响嵌套事务的执行方式。`@Transactional`注解用于管理事务,其属性包括传播行为、隔离级别、超时和只读等。最后提到了分布式事务,分为跨库和跨服务两种情况,跨服务的分布式事务通常通过最终一致性策略,如消息队列实现。
175 0
|
运维 资源调度 定位技术
【技术大图】手把手教你搭建生信分析高性能计算平台
生物医药行业产生PB级海量数据,需专业生信分析平台支持。本技术地图涵盖平台搭建全流程:从架构设计、关键技术解析,到标准化分析流程介绍及部署优化策略,助力IT团队高效构建生信算力平台。立即下载完整版!
442 1
|
NoSQL Go API
Redis Hset使用中的小坑
文章讨论了在使用Redis的HSet命令时的一个常见误区,即错误地根据命令的返回值(true/false)来判断数据是否成功插入,而实际上应通过检查错误对象(err)来判断操作是否成功。
161 0