显示在 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...");
}
...
将 stdoutLogEnabled="false" 更改为 true,然后检查 stdoutLogFile=".\logs\stdout" 处的日志。那里的错误可能会告诉你一些事情。
检查您是否使用 ASPNETCORE_ENVIRONMENT 环境变量设置了正确的环境名称,以便使用正确的设置(如连接字符串)。默认情况下,您的机器上有 "Development" 环境。
您可以使用错误 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));
我的目标是验证对象名称是否已存在于我的 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...");
}
...
将 stdoutLogEnabled="false" 更改为 true,然后检查 stdoutLogFile=".\logs\stdout" 处的日志。那里的错误可能会告诉你一些事情。
检查您是否使用 ASPNETCORE_ENVIRONMENT 环境变量设置了正确的环境名称,以便使用正确的设置(如连接字符串)。默认情况下,您的机器上有 "Development" 环境。
您可以使用错误 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));