Abp 业务异常及业务异常处理

基于Abp企业级应用开发–异常处理

在使用Abp框架中,经常会遇到业务异常及系统异常处理,今天结合实际开发过程中,介绍一下如何在Abp框架中定义业务异常、处理业务异常及处理系统异常。

Abp常用异常

  • AbpException
  • UserFriendlyException

    UserFriendlyException 是一类特殊的异常,可以直接抛给用户展示系统异常信息,给用户提示警告。

  • AbpAuthorizationException
  • AbpDbConcurrencyException
  • EntityNotFoundException
  • AbpRemoteCallException

Abp业务异常定义及异常处理

在设计业务异常时,通常情况下是,用户操作违背了业务规范,系统提示业务异常。当然在Abp框架中,我们可以使用UserFriendlyException提示给用户。

但是在使用UserFriendlyException异常时,我们发现其命名空间为Abp.UI的命名空间下,显而易见,UserFriendlyException应用的场景为应用服务中,而我们的业务异常通常发生在DomainService、AggregateRoot、BusinessService、Entity等领域服务中,与设计相悖。

因此,我们设计业务异常时,需要考虑

  1. 可以转化为UserFriendlyException异常,提示给用户
  2. 自定义错误码
  3. 自定义错误消息

我们定义系统业务异常 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


        }
    }

`