Создайте в проекте AutoLot.Dal новый каталог по имени Exceptions и поместите в него четыре новых файла классов, CustomException.cs, CustomConcurrencyException.cs, CustomDbUpdateException.cs и CustomRetryLimitExceededException.cs, содержимое которых показано ниже:

// CustomException.cs

using System;

namespace AutoLot.Dal.Exceptions

{

  public class CustomException : Exception

  {

    public CustomException {}

    public CustomException(string message) : base(message) { }

    public CustomException(string message, Exception innerException)

            : base(message, innerException) { }

  }

}

// CustomConcurrencyException.cs

using Microsoft.EntityFrameworkCore;

namespace AutoLot.Dal.Exceptions

{

  public class CustomConcurrencyException : CustomException

  {

    public CustomConcurrencyException { }

    public CustomConcurrencyException(string message) : base(message) { }

    public CustomConcurrencyException(

      string message, DbUpdateConcurrencyException innerException)

            : base(message, innerException) { }

  }

}

// CustomDbUpdateException.cs

using Microsoft.EntityFrameworkCore;

namespace AutoLot.Dal.Exceptions

{

  public class CustomDbUpdateException : CustomException

  {

      public CustomDbUpdateException { }

    public CustomDbUpdateException(string message) : base(message) { }

    public CustomDbUpdateException(

      string message, DbUpdateException innerException)

            : base(message, innerException) { }

  }

}

// CustomRetryLimitExceededException.cs

using System;

using Microsoft.EntityFrameworkCore.Storage;

namespace AutoLot.Dal.Exceptions

{

  public class CustomRetryLimitExceededException : CustomException

  {

    public CustomRetryLimitExceededException { }

    public CustomRetryLimitExceededException(string message)

        : base(message) { }

    public CustomRetryLimitExceededException(

      string message, RetryLimitExceededException innerException)

        : base(message, innerException) { }

  }

}

На заметку! Обработка специальных исключений была подробно раскрыта в главе 7.

<p id="AutBody_Root980"><strong>Переопределение метода SaveChanges</strong></p>

Как обсуждалось в предыдущей главе, метод SaveChanges базового класса DbContext сохраняет результаты операций изменения, добавления и удаления в базе данных. Переопределение этого метода позволяет инкапсулировать обработку исключений в одном месте. Располагая специальными исключениями, добавьте оператор using для AutoLot.Dal.Exceptions в начало файла ApplicationDbContext.cs, после чего переопределите метод SaveChanges:

public override int SaveChanges

{

  try

  {

    return base.SaveChanges;

  }

  catch (DbUpdateConcurrencyException ex)

  {

    // Произошла ошибка параллелизма.

    // Подлежит регистрации в журнале и надлежащей обработке.

    throw new CustomConcurrencyException(

        "A concurrency error happened.", ex);

      // Произошла ошибка параллелизма

  }

  catch (RetryLimitExceededException ex)

  {

    // Подлежит регистрации в журнале и надлежащей обработке.

    throw new CustomRetryLimitExceededException(

Перейти на страницу:

Похожие книги