C# 如何捕获DB约束冲突并抛出UserFriendlyException?
我有一个C# 如何捕获DB约束冲突并抛出UserFriendlyException?,c#,asp.net-core,aspnetboilerplate,C#,Asp.net Core,Aspnetboilerplate,我有一个crudapservice定义如下: public class MyAppService : AsyncCrudAppService<MyEntity, MyDto, int, PagedAndSortedResultRequestDto, MyCreateDto, MyDto>, IMyAppService, ITransientDependency { private readonly IRepository<MyEntity> _MyReposito
crudapservice
定义如下:
public class MyAppService : AsyncCrudAppService<MyEntity, MyDto, int, PagedAndSortedResultRequestDto, MyCreateDto, MyDto>, IMyAppService, ITransientDependency
{
private readonly IRepository<MyEntity> _MyRepository;
public MyAppService(IRepository<MyEntity> repository) : base(repository)
{
_MyRepository = repository;
}
}
因此,我尝试实现IEventHandler
来过滤DbUpdateException
并抛出UserFriendlyException
:
class MyExceptionHandler : IEventHandler<AbpHandledExceptionData>, ITransientDependency
{
public MyExceptionHandler()
{
}
public void HandleEvent(AbpHandledExceptionData eventData)
{
if (eventData.Exception is DbUpdateException dbUpdateEx) {
throw new UserFriendlyException("A message for the user");
}
}
}
类MyExceptionHandler:IEventHandler,ITransientDependency
{
公共MyExceptionHandler()
{
}
public void HandleEvent(AbpHandledExceptionData事件数据)
{
if(eventData.Exception为DbUpdateException dbUpdateEx){
抛出新的UserFriendlyException(“用户的消息”);
}
}
}
在调试过程中,我可以看到它到达了throw new userfriendly exception
行,但什么也没有发生(没有向用户显示消息),因此throw new userfriendly exception
行似乎被隐藏/忽略
我能做些什么来解决这个问题
谢谢。您正在使用ASP.NET Core吗 因为在ABP文档中:() 本文档适用于ASP.NET MVC和Web API。如果您对ASP.NET核心感兴趣,请参阅ASP.NET核心文档
我必须使用TempData和ViewBag在模式中向用户显示错误…您使用的是ASP.NET Core吗 因为在ABP文档中:() 本文档适用于ASP.NET MVC和Web API。如果您对ASP.NET核心感兴趣,请参阅ASP.NET核心文档 我必须使用TempData和ViewBag在模式中向用户显示错误 我尝试在
Create()
方法的重写中捕获它,但没有捕获到它
public override Task<MyDto> Create(MyCreateDto input)
{
try
{
return base.Create(input);
}
catch(Exception ex)
{
// Never gets here
throw new UserFriendlyException("A message for the user");
}
}
您需要调用unitOfWorkManager.Current.SaveChanges():
公共覆盖任务创建(MyCreateDto输入)
{
尝试
{
var dto=base.Create(输入);
_unitOfWorkManager.Current.SaveChanges();
返回dto;
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
或者,在数据库上下文中重写SaveChanges
和savechangesync
:
public override int SaveChanges()
{
尝试
{
返回base.SaveChanges();
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
公共覆盖异步任务saveChangesSync(CancellationToken CancellationToken=default(CancellationToken))
{
尝试
{
return wait base.SaveChanges();
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
我尝试在Create()
方法的重写中捕获它,但没有捕获到它
public override Task<MyDto> Create(MyCreateDto input)
{
try
{
return base.Create(input);
}
catch(Exception ex)
{
// Never gets here
throw new UserFriendlyException("A message for the user");
}
}
您需要调用unitOfWorkManager.Current.SaveChanges():
公共覆盖任务创建(MyCreateDto输入)
{
尝试
{
var dto=base.Create(输入);
_unitOfWorkManager.Current.SaveChanges();
返回dto;
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
或者,在数据库上下文中重写SaveChanges
和savechangesync
:
public override int SaveChanges()
{
尝试
{
返回base.SaveChanges();
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
公共覆盖异步任务saveChangesSync(CancellationToken CancellationToken=default(CancellationToken))
{
尝试
{
return wait base.SaveChanges();
}
捕获(DbUpdateException ex)
{
抛出新的UserFriendlyException(“用户的消息”);
}
}
Hi@seb49。我使用的是带有.NET core+Angular的APSnet样板文件,因此我的客户端应用程序不是用.NET technologies编写的。Hi@seb49。我使用的是带有.NET core+Angular的APSnet样板文件,因此我的客户端应用程序不是用.NET技术编写的。我在DbContext
中实现了替代方案,效果非常好。谢谢你,洛蒂在DbContext
中实现了这个替代方案,效果非常好。多谢各位