基于Abp企业级应用开发–异常处理
在使用Abp框架中,经常会遇到业务异常及系统异常处理,今天结合实际开发过程中,介绍一下如何在Abp框架中定义业务异常、处理业务异常及处理系统异常。
Abp常用异常
- AbpException
- UserFriendlyException
UserFriendlyException 是一类特殊的异常,可以直接抛给用户展示系统异常信息,给用户提示警告。
- AbpAuthorizationException
- AbpDbConcurrencyException
- EntityNotFoundException
- AbpRemoteCallException
Abp业务异常定义及异常处理
在设计业务异常时,通常情况下是,用户操作违背了业务规范,系统提示业务异常。当然在Abp框架中,我们可以使用UserFriendlyException提示给用户。
但是在使用UserFriendlyException异常时,我们发现其命名空间为Abp.UI的命名空间下,显而易见,UserFriendlyException应用的场景为应用服务中,而我们的业务异常通常发生在DomainService、AggregateRoot、BusinessService、Entity等领域服务中,与设计相悖。
因此,我们设计业务异常时,需要考虑
- 可以转化为UserFriendlyException异常,提示给用户
- 自定义错误码
- 自定义错误消息
我们定义系统业务异常 ProjectBusinessException
using System;
using Abp;
using Abp.Logging;
namespace Company.Project
{
public class ProjectBusinessException : AbpException, IHasErrorCode, IHasLogSeverity
{
public LogSeverity Severity { get; set; } = LogSeverity.Warn;
public int Code { get; set; }
public ProjectBusinessException(ErrorCode errorCode)
: base(errorCode.ToString())
{
Code = (int)errorCode;
}
public ProjectBusinessException(ErrorCode errorCode, string message)
: base(message)
{
Code = (int)errorCode;
}
public ProjectBusinessException(ErrorCode errorCode, Exception innerException)
: base(errorCode.ToString(), innerException)
{
Code = (int)errorCode;
}
public ProjectBusinessException(ErrorCode errorCode, string message, Exception innerException)
: base(message, innerException)
{
Code = (int)errorCode;
}
}
}
在定义业务异常错误发现,枚举非常适合错误码的定义:枚举名称可以详细描述业务异常,枚举值可以定义为错误码。
` using System.ComponentModel.DataAnnotations;
namespace Company.Project
{
public enum ErrorCode
{
#region 通用错误异常 0-99
/// <summary>
/// 未知异常
/// </summary>
[Display(Name = "未知异常")]
UnknownException = 0,
/// <summary>
/// 存在重复名称
/// </summary>
[Display(Name = "指定的对象存在重复")]
ExistDuplicateItem = 1,
/// <summary>
/// 指定对象未激活
/// </summary>
[Display(Name = "指定对象未激活")]
ObjectIsNotActive = 2,
#endregion
}
}
`