【愚公系列】2022年03月 .NET架构班 018-ABP vNext 异常模块
【摘要】 前言异常,也成为内中断,也成为例外或者陷入,指源自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)