Как определить, является ли исключение нарушение ссылочной целостности - PullRequest
3 голосов
/ 30 марта 2012

Мне нужен способ проверить в моем предложении catch {}, вызвано ли исключение из-за нарушения ссылочной целостности, на данный момент я использую описанный ниже метод;Есть ли лучший / элегантный / более подходящий способ определить, является ли исключение ссылочной целостности?

public static bool IsReferencialIntegrityExcpetion(this Exception exception)
        {
            return exception is SqlException &&
                   exception.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint ");
        }

Ответы [ 2 ]

11 голосов
/ 30 марта 2012

Лучшее, что вы можете сделать, это поймать SqlException вместо Exception.Затем, вместо того, чтобы полагаться на сообщение, вы можете перейти по ErrorCode (547).И помните, что вы можете объединять исключения, и они будут обрабатываться по порядку (поэтому сначала разместите более конкретные перехваты. Ваш код будет выглядеть так:

try
{
}
catch(SqlException sqlEx)
{
    if(sqlEx.ErrorCode == 547)
        throw;
}
catch(Exception ex)
{
    //General error logic
}

Если вы хотите получить полный список возможных ошибоккоды, запустите SELECT * FROM sysmessages для базы данных MASTER

1 голос
/ 30 марта 2012

SqlException генерируется для любой ошибки, возвращаемой из базы данных, независимо от того, что ее вызвало (RI, ограничение, несоответствие типов, несоответствие размеров и т. Д.). Вы не можете конкретно перехватывать только исключения на основе RI, но вы всегда можете изучить исключение (эфир, как вы, посмотрев на сообщение или, предпочтительно, просмотрев свойство Errors) и * Снова 1007 * (обратите внимание, что это просто throw;, а не throw ex;, поскольку при этом сохраняется трассировка стека), если вы на самом деле не хотите обрабатывать конкретное исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...