Перехват исключения в переопределенном методе в C# - PullRequest
0 голосов
/ 14 февраля 2020

Почему следующий блок catch не перехватывает никаких исключений? Это как-то связано с отношением override-> base.Method ()?

На скриншоте видно, что выбрасывается исключение SqlException с номером 2627, но блок catch никогда не перехватывает его.

    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (SqlException ex) when (ex.Number == 2627)
        {
            Log.Error($"Duplicate key constraint violation occured while submitting changes, {ex.Message}");
            var (resource, duplicateKey) = ExtractDuplicateKeyViolationDetails(ex.Message);
            throw new DuplicateKeyException(resource, duplicateKey);
        }
        catch (SqlException ex) when (ex.Number == 547)
        {
            Log.Error($"Constraint violation occured while submitting changes, {ex.Message}");
            var (resource, property) = ExtractConstraintViolationDetails(ex.Message);
            throw new ConstraintViolationException(resource, property);
        }
    }

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Оказывается, проблема в том, что выброшенное исключение было не SqlException, а DbUpdateException, где SqlException было встроено как InnerException InnerException ...

Я решил это в следующем формате:

    catch (DbUpdateException ex) when (ex.MostInnerException() is SqlException sqlException && sqlException.Number == 2627)
    {
        Log.Error($"Duplicate key constraint violation occured while submitting changes, {sqlException.Message}");
        var (resource, duplicateKey) = ExtractDuplicateKeyViolationDetails(sqlException.Message);
        throw new DuplicateKeyException(resource, duplicateKey);
    }

    internal static Exception MostInnerException(this Exception ex)
    {
        var innerException = ex;

        while (innerException.InnerException != null)
        {
            innerException = innerException.InnerException;
        }

        return innerException;
    }
0 голосов
/ 14 февраля 2020

Вы запускаете свой код в режиме отладки. VS останавливает выполнение всякий раз, когда выдается исключение, и это то, что вы видите. Нажмите F5, чтобы продолжить выполнение, и он войдет в блок catch.

...