显示在 EF Core 存储库中创建的异常而不是 500 错误

Show exception created in EF Core repository instead of 500 Error

我的目标是验证对象名称是否已存在于我的 EF Core 数据库中,如果存在:抛出特定错误。但是,我收到 500 内部服务器错误。

首先我在 DbContext 中创建了一个名称索引,包括 IsUnique 和一些代码来捕获存储库中的异常。

我可以在控制器中添加一些内容,说明如果错误代码 == 2601 然后抛出 "the required exception" 吗?还是有另一种方法来克服这个 500 错误?在此先感谢您的帮助!

DbContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasIndex(c => c.Name)
        .IsUnique();
}

存储库:

public async Task<bool> SaveAsync()
{
    try
    {
        return (await _context.SaveChangesAsync() >= 0);
    }
    catch (DbUpdateException dbEx)
    {
        SqlException sqlException = dbEx.InnerException as SqlException;
        if (sqlException.Number == 2601)
        {
            throw new Exception("Name already exists. Please provide a different name.");
        }
        throw new Exception(dbEx.Message);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

控制器:

Public async Task<IActionResult> AddCar([FromBody] Car car)
    ...
    if (!await _repository.SaveAsync())
    {
        throw new Exception("Fail on save...");
    }
    ...
  1. 将 stdoutLogEnabled="false" 更改为 true,然后检查 stdoutLogFile=".\logs\stdout" 处的日志。那里的错误可能会告诉你一些事情。

  2. 检查您是否使用 ASPNETCORE_ENVIRONMENT 环境变量设置了正确的环境名称,以便使用正确的设置(如连接字符串)。默认情况下,您的机器上有 "Development" 环境。

  3. 您可以使用错误 Handling middlewares 来显示例外情况,例如

    app.UseDeveloperExceptionPage();

如果您使用的是 ASP.Net 核心,您可以创建自己的 exception handling middleware

错误处理中间件 class 本身可能类似于:

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate m_next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        m_next = next;
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await m_next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        HttpStatusCode httpStatusCode = HttpStatusCode.InternalServerError;
        string message = "Something is wrong!";

        if (exception is MyException)
        {
            httpStatusCode = HttpStatusCode.NotFound; // Or whatever status code you want to return
            message = exception.Message; // Or whatever message you want to return
        }

        string result = JsonConvert.SerializeObject(new
        {
            error = message
        });

        context.Response.StatusCode = (int)httpStatusCode;
        context.Response.ContentType = "application/json";
        return context.Response.WriteAsync(result);
    }
}

您在 Startup.Configure() 中注册为:

app.UseMiddleware(typeof(ErrorHandlingMiddleware));