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,如需转载请自行联系原作者

目录
相关文章
|
存储 JSON 搜索推荐
ISV
ISV(独立软件供应商)是一种为其他公司或个人提供软件产品或服务的公司。ISV 通常专注于开发和销售特定的软件解决方案,以满足客户的需求。ISV 可以提供各种类型的软件,包括桌面应用程序、Web 应用程序、移动应用程序、游戏等。
1539 1
ISV
|
数据采集
总结一下最近看到的几个数字化转型成功案例
总结一下最近看到的几个数字化转型成功案例
|
关系型数据库 流计算 PostgreSQL
关于PostgreSQL逻辑订阅中的复制状态
关于PostgreSQL逻辑订阅中的复制状态
3307 0
|
10月前
|
存储 缓存 监控
深度剖析阿里巴巴平台商品详情接口:技术、应用与代码实战
阿里巴巴商品详情接口基于RESTful架构,使用HTTP协议通信,支持GET和POST请求方式。开发者需通过App Key和App Secret进行签名认证,确保接口安全调用。核心端点如`https://api.1688.com/router/rest?method=alibaba.item.get`可用于获取商品基本信息,常见参数包括`fields`(指定返回字段)和`num_iid`(商品ID)。接口响应为JSON格式,包含商品标题、价格、库存、描述、图片链接、供应商信息等。开发者可结合实际需求进行数据提取与处理。
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
|
人工智能 自然语言处理 PyTorch
从千问Agent看AI Agent——我们很强,但还有很长的路要走
本项目主要通过通义千问作为基础大模型,通义Agent浏览器助手实现网页和PDF材料,以帮助您快速了解多个页面的内容,总结您浏览过的内容,并减少繁琐的文字工作。实现数据分析与可视化、处理文件等的代码解释器功能。
从千问Agent看AI Agent——我们很强,但还有很长的路要走
|
应用服务中间件 nginx Windows
nginx实现网站url带参跳转 POST请求GET请求跳转
nginx实现网站url带参跳转 POST请求GET请求跳转
906 1
|
存储 人工智能 自然语言处理
通义千问 Qwen 系列的 Agent 方向探索
通义千问Qwen系列在AI领域展现了强大的Agent方向探索能力,包括灵活的Tool调用、单/多Agent场景实践等,通过丰富的代码示例展示了其在文本生成、信息检索、任务自动化及专业领域应用等方面的优势,为复杂应用场景提供了多元且实用的解决方案。
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
414 1
|
存储 开发框架 缓存
ABP VNext框架中Winform终端的开发和客户端授权信息的处理
ABP VNext框架中Winform终端的开发和客户端授权信息的处理