【愚公系列】2022年03月 .NET架构班 018-ABP vNext 异常模块

举报
愚公搬代码 发表于 2022/03/10 01:20:39 2022/03/10
【摘要】 前言异常,也成为内中断,也成为例外或者陷入,指源自CPU执行指令内部的事件,如程序的非法操作码,地址越界,算术溢出、虚存系统的缺页以及专门的陷入指令等引起的。异常程序是指程序执行一些非法指令,异常程序出现的原因有:1、程序设计时出现的编程错误或运行时出现的硬件错误,一般可以通过异常处理解决问题;2、精心设计地入侵系统程序,如病毒。常用异常处理包含两种情况异常捕获异常类 1.异常捕获异常是在...

前言

异常,也成为内中断,也成为例外或者陷入,指源自CPU执行指令内部的事件,如程序的非法操作码,地址越界,算术溢出、虚存系统的缺页以及专门的陷入指令等引起的。异常程序是指程序执行一些非法指令,异常程序出现的原因有:1、程序设计时出现的编程错误或运行时出现的硬件错误,一般可以通过异常处理解决问题;2、精心设计地入侵系统程序,如病毒。

常用异常处理包含两种情况

  • 异常捕获
  • 异常类

1.异常捕获

异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。

异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。

  • try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
  • catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
  • finally:finally
    块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
  • throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

2.异常类

异常类 描述
System.IO.IOException 处理 I/O 错误。
System.IndexOutOfRangeException 处理当方法指向超出范围的数组索引时生成的错误。
System.ArrayTypeMismatchException 处理当数组类型不匹配时生成的错误。
System.NullReferenceException 处理当依从一个空对象时生成的错误。
System.DivideByZeroException 处理当除以零时生成的错误。
System.InvalidCastException 处理在类型转换期间生成的错误。
System.OutOfMemoryException 处理空闲内存不足生成的错误。
System.StackOverflowException 处理栈溢出生成的错误。

一、异常模块

1.默认异常信息

/// <summary>
/// 商品领域服务
/// </summary>
[Dependency(ServiceLifetime.Transient)]
public class ProductManager /*: ITransientDependency*/
{
    private readonly IProductRepository _productRepository;
    private readonly IStringLocalizer<EBusinessResource> _localizer;
    public ILanguageProvider languageProvider { set; get; } // 获取所有语言

    public ProductManager(IProductRepository productRepository,
                            IStringLocalizer<EBusinessResource> localizer)
    {
        _productRepository = productRepository;
        _localizer = localizer;
    }

    /// <summary>
    /// 1、规则1:商品名称不能重复
    /// 2、规则2:商品名称不能为空
    /// </summary>
    /// <param name="ProductTitle"></param>
    public void HasProductTitle(string ProductTitle)
    {
        Product products = _productRepository.GetProductByName(ProductTitle);
        if (products != null)
        {
            #region 1、默认异常信息
            {
                throw new Exception("商品名称不能重复");
                /*throw new Exception(_localizer["ProductException", ProductTitle]);*/
            }
            #endregion
        }
    }
}

抛出500的错误信息

在这里插入图片描述

2.abp异常信息

/// <summary>
/// 异常编号定义。代码中表示,就是一个字符串
/// </summary>
public static class EBusinessDomainErrorCodes
{
    public const string ProductCreateErrorCode = "-1"; // 商品创建错误编号
}
#region abp异常信息
{
    // ProductException
    throw new BusinessException(EBusinessDomainErrorCodes.ProductCreateErrorCode, _localizer["ProductException"]);
   // throw new BusinessException(EBusinessDomainErrorCodes.ProductCreateErrorCode, "The product name must be unique");
}
#endregion

抛出403错误信息
在这里插入图片描述

3.abp友好异常信息

#region 3、abp友好异常信息
{
    throw new UserFriendlyException("商品名称不能重复", EBusinessDomainErrorCodes.ProductCreateErrorCode, "商品名称[" + ProductTitle + " ]不能重复")
                .WithData("productTitle", ProductTitle);
}
#endregion

在这里插入图片描述

4.客户端输出异常信息

EBusinessDomainModule中添加

[DependsOn(
    typeof(EBusinessDomainSharedModule),
    typeof(AbpAuditLoggingDomainModule),
    typeof(AbpBackgroundJobsDomainModule),
    typeof(AbpFeatureManagementDomainModule),
    typeof(AbpIdentityDomainModule),
    typeof(AbpPermissionManagementDomainIdentityModule),
    typeof(AbpIdentityServerDomainModule),
    typeof(AbpPermissionManagementDomainIdentityServerModule),
    typeof(AbpSettingManagementDomainModule),
    typeof(AbpTenantManagementDomainModule),
    typeof(AbpEmailingModule)
)]
public class EBusinessDomainModule : AbpModule
{
    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
       // AbpIdentityDbProperties.DbTablePrefix = "";
       // AbpSettingManagementDbProperties.DbTablePrefix = "";
    }
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpMultiTenancyOptions>(options =>
        {
            options.IsEnabled = MultiTenancyConsts.IsEnabled;
        });

        // 1、把详细信息输出到客户端
        Configure<AbpExceptionHandlingOptions>(options =>
        {
            options.SendExceptionsDetailsToClients = true;
        });

        

#if DEBUG
        context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif
    }

}

在这里插入图片描述

5.自定义异常状态码

EBusinessHttpApiModule中配置

[DependsOn(
    typeof(EBusinessApplicationContractsModule),
    typeof(AbpAccountHttpApiModule),
    typeof(AbpIdentityHttpApiModule),
    typeof(AbpPermissionManagementHttpApiModule),
    typeof(AbpTenantManagementHttpApiModule),
    typeof(AbpFeatureManagementHttpApiModule),
    typeof(AbpSettingManagementHttpApiModule)
    )]
public class EBusinessHttpApiModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        ConfigureLocalization();

        // 1、自定义异常状态吗
        Configure<AbpExceptionHttpStatusCodeOptions>(options =>
        {
            options.Map(EBusinessDomainErrorCodes.ProductCreateErrorCode, HttpStatusCode.Forbidden);
        });
    }

    private void ConfigureLocalization()
    {
        Configure<AbpLocalizationOptions>(options =>
        {
            options.Resources
                .Get<EBusinessResource>()
                .AddBaseTypes(
                    typeof(AbpUiResource)
                );
        });
    }
}

在这里插入图片描述

6.校验异常

只需要在类上配置特性就行

public class CreateProductDto /*: IValidatableObject*/
{
    public string ProductUrl { set; get; }         // 商品主图
    [Required]
    [StringLength(10)]
    //[ProductName]
    //[Range(3, 10)]
    // 规则3:商品名称长度不能大于10
    // 规则4:商品名称不能有数字
    public string ProductTitle { set; get; }       //商品标题
    public string ProductDescription { set; get; }     // 图文描述
    public decimal ProductVirtualprice { set; get; } //商品虚拟价格
    public decimal ProductPrice { set; get; }       //价格

    public ProductImageCreateDto[] ProductImages { set; get; } // 商品图片集合

    /*public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        throw new NotImplementedException();
    }*/
}

public class ProductImageCreateDto
{
    public ProductImageCreateDto()
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { set; get; } // Guid
    public string ImageUrl { set; get; } // 图片url
    public string ImageStatus { set; get; } // 图片状态
} 

在这里插入图片描述
自定义校验异常

[AttributeUsage(AttributeTargets.Property| AttributeTargets.Field)]
public class ProductNameAttribute : ValidationAttribute
 {
     public ProductNameAttribute()
     {

     }
 }
// <summary>
/// 自定义校验特性判断
/// </summary>
// [Dependency(ServiceLifetime.Transient)]
public class ProductNameAttributeValidationResultProvider : IAttributeValidationResultProvider
{
    public ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext)
    {
        return validationAttribute.GetValidationResult(validatingObject, validationContext);
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。