2012-03-30 1 views
3

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

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

ответ

10

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

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

Если вы хотите полный список возможных кодов ошибок, пробег SELECT * FROM sysmessages по отношению к базе данных MASTER

+0

А код ошибки! да, это именно то, что мне нужно, благодарю вас. –

1

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

+0

хорошая точка о выбросе –

Смежные вопросы