Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获DB约束冲突并抛出UserFriendlyException?_C#_Asp.net Core_Aspnetboilerplate - Fatal编程技术网

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
中实现了这个替代方案,效果非常好。多谢各位