Показывать исключение, созданное в репозитории EF Core, вместо 500 Error - PullRequest
0 голосов
/ 08 ноября 2018

Моя цель - проверить, существует ли имя объекта в моей базе данных EF Core, если это так: вывести конкретную ошибку.Тем не менее, я получаю 500 внутренних ошибок сервера.

Сначала я создал индекс по имени в DbContext, включая IsUnique и некоторый код для перехвата исключения в хранилище.

Можно ли добавить что-нибудь в контроллер, которыйговорит, что если errorcode == 2601 то выдает "обязательное исключение"?Или есть другой способ преодолеть эту ошибку 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...");
    }
    ...

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Если вы используете ASP.Net Core, вы можете создать собственное промежуточное ПО для обработки исключений .

Сам класс промежуточного программного обеспечения для обработки ошибок может выглядеть примерно так:

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));
0 голосов
/ 08 ноября 2018
  1. Измените stdoutLogEnabled = "false" на true, а затем проверьте журналы в stdoutLogFile = ". \ Logs \ stdout". Ошибка (ы) может что-то вам сказать.

  2. Убедитесь, что вы установили правильное Имя среды с помощью переменной среды ASPNETCORE_ENVIRONMENT, так что используйте правильные настройки, такие как строка подключения. На вашей машине по умолчанию у вас есть среда разработки.

  3. Вы можете использовать Ошибка Обработка промежуточного программного обеспечения для отображения исключений, таких как

    app.UseDeveloperExceptionPage ();

...