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模板中默认的错误视图):

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在上一篇文章中,我们介绍了ABP框架中本地化处理的基本概念和实现方式,本篇文章将继续介绍一些高级用法和注意事项。 ### 1. 使用占位符 在实际应用中,我们可能需要在本地化字符串中使用一些动态的变量,例如用户的姓名、当前时间等。为了实现这个功能,我们可以在本地化字符串中使用占位符,然后在程序中动态替换它们的值。 例如,我们可以在资源文件中定义一个本地化字符串: ``` "HelloUser": "Hello {0}!" ``` 然后在程序中使用 `L` 方法获取该字符串,并提供一个参数来替换占位符: ```csharp string userName = "Tom"; string helloMessage = L("HelloUser", userName); ``` 这样,`helloMessage` 的值就是 `"Hello Tom!"`。 ### 2. 处理复数形式 有些语言(如俄语、波兰语等)中,名词的复数形式与单数形式不同,因此在本地化处理中需要特殊处理复数形式。 在ABP框架中,我们可以使用 `L` 方法的第二个参数来指定复数形式的数量。例如,我们可以在资源文件中定义一个本地化字符串: ``` "UnreadMessages": "{0} unread message|{0} unread messages" ``` 其中,`|` 后面的部分表示复数形式,可以包含多个用 `|` 分隔的字符串,每个字符串都代表一种复数形式,数量从少到多依次排列。 然后在程序中使用 `L` 方法获取该字符串,并提供一个参数来指定复数形式的数量: ```csharp int unreadCount = 5; string unreadMessage = L("UnreadMessages", unreadCount); ``` 当 `unreadCount` 等于 1 时,`unreadMessage` 的值为 `"5 unread message"`;当 `unreadCount` 大于 1 时,`unreadMessage` 的值为 `"5 unread messages"`。 ### 3. 注意事项 在使用ABP框架进行本地化处理时,需要注意以下几点: - 必须在资源文件中提供默认语言的本地化字符串,即使默认语言与目标语言相同也是如此。 - 在 `L` 方法中使用的本地化字符串必须在资源文件中存在,否则会抛出异常。 - 如果在资源文件中使用占位符或复数形式,必须确保在程序中提供足够的参数来替换它们。 - 如果在资源文件中使用了 HTML 标记或其他特殊字符,必须在程序中进行适当的转义,以避免 XSS 攻击。 总之,ABP框架提供了一种方便易用的本地化处理机制,可以帮助我们轻松地实现跨语言的应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值